Как получить доступ к request.user из чистого метода администратора ModelForm? - PullRequest
5 голосов
/ 12 февраля 2010

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

Ответы [ 2 ]

4 голосов
/ 12 февраля 2010

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

0 голосов
/ 12 февраля 2010

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

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

...