如何在需要外部数据时验证Django formfield?

时间:2014-11-10 07:24:32

标签: django forms validation

我想创建一个自定义FormField以在我的应用程序中使用,并根据https://docs.djangoproject.com/en/1.7/ref/forms/validation/#form-field-default-cleaning的建议针对它编写适当的验证。就我而言,它是一个SMS收件人列表。

但是,部分验证过程要求我验证指定的收件人列表确实是存储在当前用户的地址簿中的收件人。特别是,我需要拒绝任何不属于该用户的收件人。

如何在执行验证时访问存储在请求中的值(如当前用户)?或者,有什么办法可以在验证时传递这个值吗?

1 个答案:

答案 0 :(得分:2)

这种验证应该在你的视图中进行,但是如果你仍然希望在表单中进行,那么下面,我想,你想要的是:

class SomeView(FormView):
    form_class = SomeForm

    def get_form_kwargs(self):
        kwargs = super(SomeView, self).get_form_kwargs()
        kwargs.update({
            'extra_param': self.some_param
        })

        return kwargs

class SomeForm(forms.ModelForm):
    class Meta:
        model = Human
        fields = ['name']

    def __init__(self, *args, **kwargs):
        self.extra_param = kwargs.pop('excluded_pk')  # you should pop it from kwargs before parent init call

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

    def clean_name(self):
        name = self.cleaned_data['name']

        if name != self.extra_param:  # since extra_param is object variable you can use it here
            raise forms.ValidationError('tadaam!')

        return name