【问题标题】:How to validate Django formfield when external data is required?需要外部数据时如何验证 Django 表单域?
【发布时间】:2014-11-10 07:24:32
【问题描述】:

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

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

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

【问题讨论】:

    标签: django forms validation


    【解决方案1】:

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

    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
    

    【讨论】:

    • 谢谢@madzhon。这正是我正在寻找的解决方案!我需要在表单中进行此验证,因为该表单在多个页面上使用,并且该表单未映射到简单模型。
    猜你喜欢
    • 1970-01-01
    • 2017-09-18
    • 2019-06-03
    • 1970-01-01
    • 2011-10-27
    • 1970-01-01
    • 2011-02-17
    • 2015-05-10
    相关资源
    最近更新 更多