2010-02-12 2 views
5

Я делаю некоторые вещи на «чистый» на администратор ModelForm:Как получить доступ к request.user из метода очистки модели 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 установить сообщение? Я не могу передать его конструктору формы, потому что он не вызывается из моего кода.

ответ

4

Вы не можете сделать это в форме, не передавая пользователя в конструктор формы. Вместо этого вы можете использовать функцию ModelAdmin.save_model, которой задан объект запроса.

Метод save_model дается HttpRequest, экземпляр модели, а ModelForm экземпляр и логическое значение, основанное на ли это добавление или изменение объекта. Здесь вы можете сделать любые операции до или после сохранения.

http://docs.djangoproject.com/en/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.save_model

Edit: Поскольку вы хотите поместить логику/сообщения в чистой функции вы могли бы сделать что-то вроде:

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

+1

Mmmmm. Сообщение зависит от некоторой логики проверки, поэтому гораздо полезнее жить в методе pureForm Model(). Если я переведу его в ModelAdmin save_model(), мне нужно будет написать какую-то грязную логику только ради отправки сообщения! –

+0

Справедливая точка. Проверьте мое редактирование и посмотрите, помогло ли это. –

+0

Я переместил user_messages в init и добавил self. к строке 'user_messages.append', и это сработало! Благодарю. –

-1

Вам нужно будет явно передать его там в конструкторе, что не является чем-то, что обычно делается.

Вы уверены, что хотите добавить этот материал в форму? Что именно вы хотели бы сделать там? Не поднимает ли ValidationError?

+0

Как уже упоминалось, конструктор не в моем коде - это в contrib.admin. Сообщение, которое я хочу отправить, не является ошибкой. Это уведомление, когда сохранение формы повлияло на другую часть системы. –

+0

Но это странно - как вы можете быть уверены, что вы должны отправить сообщение до фактического сохранения объекта из формы? Между чистым и экономичным может случиться много разных вещей. – gruszczy

+0

Принимая во внимание, что мы говорим о просмотре изменений администратора, что может произойти между чистым и экономичным? –

Смежные вопросы