我的表单上有一个选择列表下拉框,其中填充了模型(导演)中的数据。此下拉列表的值不需要保存;它实际上只用于动态触发表单的另一个元素(标题为Films的下拉列表)。因此,当用户选择Director时,它会动态填充第二个列表,并将Films附加到该Director。
第一个列表的第一个元素是“所有董事”。它不是过滤电影列表,而是让所有电影都显示在第二个列表中,因为选择了所有导演。
如果用户选择特定的导演然后选择电影,则表单会正确提交。问题是,如果用户选择所有导演,然后选择电影,则在提交表单时,它会告诉我,我对导演的选择无效,因为它不是可用选项之一。在这种情况下,可用选项(我假设)是数据库中现有的Director.objects之一。但因为我不关心导演,所以我不需要此条目有效。我只需要电影有效。
我正在使用ModelForm。 如何禁用或覆盖Director表单字段上的数据验证,以便忽略该字段生成的错误?
答案 0 :(得分:26)
最简单的方法是定义自己的方法来验证表单,如下所示:
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。
答案 1 :(得分:7)
由于某种原因,接受的答案对我不起作用(不知道是因为事情发生了变化,还是我使用的是内联形式或者是什么),但是覆盖了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']