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

时间:2010-12-02 21:45:36

标签: django django-forms validation

我的表单上有一个选择列表下拉框,其中填充了模型(导演)中的数据。此下拉列表的值不需要保存;它实际上只用于动态触发表单的另一个元素(标题为Films的下拉列表)。因此,当用户选择Director时,它会动态填充第二个列表,并将Films附加到该Director。

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

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

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

2 个答案:

答案 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']