为了账号安全,请及时绑定邮箱和手机立即绑定

如何访问表单的clean()方法中的请求对象或任何其他变量?

/ 猿问

如何访问表单的clean()方法中的请求对象或任何其他变量?

catspeake 2019-10-06 14:59:42

我正在尝试使用request.user获取表单的clean方法,但是如何访问请求对象?我可以修改clean方法以允许输入变量吗?



查看完整描述

3 回答

?
森栏

Ber的答案-将其存储在threadlocals中-是一个非常糟糕的主意。绝对没有理由这样做。


更好的方法是重写表单的__init__方法以使用额外的关键字参数request。这会将请求存储在表单中,在需要的地方,您可以从此处以干净的方法访问它。


class MyForm(forms.Form):


    def __init__(self, *args, **kwargs):

        self.request = kwargs.pop('request', None)

        super(MyForm, self).__init__(*args, **kwargs)



    def clean(self):

        ... access the request object via self.request ...

并且在您看来:


myform = MyForm(request.POST, request=request)


查看完整回答
反对 回复 2019-10-06
?
桃花长相依

我现在将它与元类(而不是方法)一起使用,因为Django 1.3否则会显示一些怪异之处。


class MyModelAdmin(admin.ModelAdmin):

    form = MyCustomForm

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

        ModelForm = super(MyModelAdmin, self).get_form(request, obj, **kwargs)

        class ModelFormMetaClass(ModelForm):

            def __new__(cls, *args, **kwargs):

                kwargs['request'] = request

                return ModelForm(*args, **kwargs)

        return ModelFormMetaClass

然后重写MyCustomForm.__init__如下:


class MyCustomForm(forms.ModelForm):

    def __init__(self, *args, **kwargs):

        self.request = kwargs.pop('request', None)

        super(MyCustomForm, self).__init__(*args, **kwargs)

然后,您可以使用ModelFormwith的任何方法访问请求对象self.request。


查看完整回答
反对 回复 2019-10-06
?
慕沐林林

值得一说的是,如果使用的是基于类的视图,而不是基于函数的视图,请get_form_kwargs在编辑视图中覆盖。自定义CreateView的示例代码:


from braces.views import LoginRequiredMixin


class MyModelCreateView(LoginRequiredMixin, CreateView):

    template_name = 'example/create.html'

    model = MyModel

    form_class = MyModelForm

    success_message = "%(my_object)s added to your site."


    def get_form_kwargs(self):

        kw = super(MyModelCreateView, self).get_form_kwargs()

        kw['request'] = self.request # the trick!

        return kw


    def form_valid(self):

        # do something

上面的视图代码将request作为关键字的参数之一提供给表单的__init__构造函数。因此,在您ModelForm执行以下操作:


class MyModelForm(forms.ModelForm):

    class Meta:

        model = MyModel


    def __init__(self, *args, **kwargs):

        # important to "pop" added kwarg before call to parent's constructor

        self.request = kwargs.pop('request')

        super(MyModelForm, self).__init__(*args, **kwargs)


查看完整回答
反对 回复 2019-10-06

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信