Django: доступ к объекту запроса из формы admin.clean () - PullRequest
12 голосов
/ 21 апреля 2010

Мой вопрос очень похож на этот: Как получить доступ к объекту запроса или любой другой переменной в методе clean () формы?

Кроме того, у меня та же проблема с формой администратора. Поэтому я не вижу способа самостоятельно инициировать форму, чтобы передать ей запрос.

Заранее спасибо.

Ответы [ 2 ]

39 голосов
/ 08 февраля 2012

Действительно, есть способ решить вашу проблему!

Вам потребуется форма подкласса , предоставленная ModelAdmin.get_form()переопределить это:

class BusinessDocumentCommentForm(forms.ModelForm):

    def __init__(self, *args, **kwargs):
        self.request = kwargs.pop('request', None)
        # Voila, now you can access request anywhere in your form methods by using self.request!
        super(BusinessDocumentCommentForm, self).__init__(*args, **kwargs)
        if self.request.GET.get('document_pk', False):
            #Do something
    def clean(self):
        # Do something with self.request
        # etc.    
    class Meta:
        model = BusinessDocumentComment

class BusinessDocumentCommentAdmin(admin.ModelAdmin):

    form = BusinessDocumentCommentForm     

    def get_form(self, request, obj=None, **kwargs):

        AdminForm = super(BusinessDocumentCommentAdmin, self).get_form(request, obj, **kwargs)

        class AdminFormWithRequest(AdminForm):
            def __new__(cls, *args, **kwargs):
                kwargs['request'] = request
                return AdminForm(*args, **kwargs)

        return AdminFormWithRequest
0 голосов
/ 21 апреля 2010

В классе ModelAdmin есть ряд хуков, которые позволяют вам делать это следующим образом - посмотрите на код в django.contrib.admin.options.

Вам могут помочь два метода: ModelAdmin.save_form и ModelAdmin.save_model, оба из которых передаются объекту запроса. Таким образом, вы можете переопределить эти методы в своем подклассе Admin и выполнить любую дополнительную обработку, которая вам нужна.

Отредактировано после комментария

Вы совершенно правы, что это не позволит вам проверять форму в зависимости от привилегий пользователя. К сожалению, создание формы похоронено глубоко внутри add_view и change_view методов ModelAdmin.

Существует не так много возможностей без дублирования большого количества существующего кода. Вы можете переопределить методы *_view; или вы можете попробовать переопределить функцию modelform_factory, чтобы вернуть новый класс с уже запрошенным объектом запроса; или вы можете попробовать поиграться с методом класса __new__, чтобы сделать то же самое, но это сложно из-за метакласса формы.

...