Django:来自admin的form.clean()的访问请求对象

Wis*_*man 13 django django-forms django-admin

我的问题与此问题非常相似:如何在表单的clean()方法中访问请求对象或任何其他变量?

除此之外,我对admin表单也有同样的问题.因此,我无法看到自己初始化表单的方法,因此 - 将请求传递给它.

先谢谢.

Iva*_*mov 40

的确,有一种方法可以解决您的问题!

您将需要子类化提供的表单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
Run Code Online (Sandbox Code Playgroud)

  • @melbic我在3.0中看到它:https://docs.djangoproject.com/en/3.0/ref/contrib/admin/#django.contrib.admin.ModelAdmin.get_form (2认同)