Как получить доступ к request.user от администратора, ModelForm чистят метод?

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

5
задан Andy Baker 12 February 2010 в 13:44
поделиться

2 ответа

Вы не можете сделать это в форме, не передав пользователя в конструктор формы. Вместо этого вы можете использовать функцию 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

4
ответ дан 15 December 2019 в 06:25
поделиться

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

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

-1
ответ дан 15 December 2019 в 06:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: