在一个 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 表单元素上覆盖数据验证的主要内容,如果未能解决你的问题,请参考以下文章