Я делаю некоторый материал на 'чистом' на администраторе ModelForm:
class MyAdminForm(forms.ModelForm):
def clean(self):
# Some stuff happens...
request.user.message_set.create(message="Some stuff happened")
class MyAdmin(admin.ModelAdmin):
form = MyAdminForm
Кроме взлома threadlocals - как я получаю доступ к request.user для установки сообщения? Я не могу передать его конструктору формы, потому что не становится названным от моего кода.
Вы не можете сделать это в форме, не передав пользователя в конструктор формы. Вместо этого вы можете использовать функцию ModelAdmin.save_model
, которой предоставляется объект запроса.
Методу save_model предоставляется HttpRequest, экземпляр модели, экземпляр ModelForm и логическое значение в зависимости от того, добавляет он или изменяет объект. Здесь вы можете выполнять любые операции до или после сохранения.
http://docs.djangoproject.com/en/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.save_model
Изменить: Поскольку вы хотите поместить логику / messages в чистой функции вы можете сделать что-то вроде:
class MyAdminForm(forms.ModelForm):
user_messages = []
def clean(self):
# Some stuff happens...
user_messages.append("Some stuff happened")
class MyAdmin(admin.ModelAdmin):
form = MyAdminForm
def save_model(self, request, obj, form, change):
for message in form.user_messages:
request.user.message_set.create(message=message)
Очень позднее редактирование:
user.message_set
объявлен устаревшим в Django 1.4. Вместо этого следует использовать ModelAdmin.message_user
. https://docs.djangoproject.com/en/1.3/ref/contrib/admin/#django.contrib.admin.ModelAdmin.message_user
Вам нужно будет явно передать его туда в конструкторе, что обычно не делается.
Вы уверены, что хотите поместить это в форму? Что именно вы хотели бы там делать? Разве недостаточно повышения ValidationError
?