在一个 django 表单元素上覆盖数据验证

Posted

技术标签:

【中文标题】在一个 django 表单元素上覆盖数据验证【英文标题】:Override data validation on one django form element 【发布时间】:2011-05-19 10:11:12 【问题描述】:

我的表单上有一个选择列表下拉框,其中填充了来自模型(董事)的数据。这个下拉列表的值不需要保存;它实际上仅用于动态触发表单的另一个元素(名为 Films 的下拉菜单)。因此,当用户选择导演时,它会动态填充第二个列表,其中包含附加到该导演的电影。

第一个列表的第一个元素是“所有董事”。它不是过滤电影列表,而是让所有电影都显示在第二个列表中,因为选择了所有导演。

如果用户选择了特定的导演,然后选择了电影,则表单会正确提交。问题是,如果用户选择所有导演,然后选择一部电影,则在提交表单时,它告诉我我对导演的选择无效,因为它不是可用的选项之一。在这种情况下,一个可用的选择(我假设)是数据库中现有的 Director.objects 之一。但是因为我不关心主任,所以我不需要这个条目是有效的。我只需要 Film 有效。

我正在使用 ModelForm。 如何禁用或覆盖 Director 表单字段上的数据验证,以使其忽略该字段生成的错误?

【问题讨论】:

【参考方案1】:

最简单的方法是定义自己的表单验证方法,如下所示:

class MyForm(forms.ModelForm):
    class Meta:
        model = WhateverModel

    def clean(self):
        super(MyForm, self).clean() #if necessary
        if self.cleaned_data.get('film') and 'director' in self._errors:
            del self._errors['director']
        return self.cleaned_data                            

请参阅 http://docs.djangoproject.com/en/dev/ref/forms/validation/#cleaning-and-validating-fields-that-depend-on-each-other 以获得更广泛的解释,并参阅 http://docs.djangoproject.com/en/dev/topics/forms/modelforms/#overriding-the-clean-method 了解它如何应用于 ModelForms。

【讨论】:

super(MyForm, self).clean() 是否允许默认的基于模型的验证仍然有效? 是的。在您到达表单的 clean 方法之前,字段验证器将已经运行。您可以检查他们是否在表单的“错误”属性中生成了一些错误。 (Django 1.8)【参考方案2】:

由于某种原因,接受的答案对我不起作用(不知道是不是因为事情发生了变化,或者我正在使用内联表单或什么),但是覆盖 full_clean 有效:

class MyForm(forms.ModelForm):
    def full_clean(self):
        super(MyForm, self).full_clean()
        if self.cleaned_data.get('film') and 'director' in self._errors:
            del self._errors['director']

【讨论】:

我赞同@Jack 所说的。

以上是关于在一个 django 表单元素上覆盖数据验证的主要内容,如果未能解决你的问题,请参考以下文章

jquery 远程验证 - 验证字段中的数据是不是

Django实战-----用户登录与注册系统4(表单)

Django 表单验证

django表单的Widgets

django表单

带有内联表单集的 Django 表单验证