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

Ed.*_*Ed. 13 django validation django-forms

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

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

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

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

GDo*_*orn 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                            
Run Code Online (Sandbox Code Playgroud)

有关更详细的说明,请参阅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.


Jac*_*man 8

由于某种原因,接受的答案对我不起作用(不知道是否因为事情已经改变,或者我使用的是内联形式或者是什么),但是覆盖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']
Run Code Online (Sandbox Code Playgroud)