Django ModelForm在模型上重写clean()时未验证单个字段

Django ModelForm在模型上重写clean()时未验证单个字段,django,validation,model,field,modelform,Django,Validation,Model,Field,Modelform,我使用的是标准的Django模型和ModelForms 在模型上,我重写clean方法以检查组合中的两个字段是否有效。我在其他字段上定义了验证器[],而不是空值等 在ModelForm中,我没有修改任何内容。我只在ModelForm的元类中设置了相应的模型 当我试图通过表单创建一个新对象时,调用form.is_在视图中有效时,ModelForm/Model中的各个字段不会被验证。根据文档,表单上的is\u valid方法应该首先调用模型的clean\u fields方法 当您提交的表单没有模型实

我使用的是标准的Django模型和ModelForms

在模型上,我重写clean方法以检查组合中的两个字段是否有效。我在其他字段上定义了验证器[],而不是空值等

在ModelForm中,我没有修改任何内容。我只在ModelForm的元类中设置了相应的模型

当我试图通过表单创建一个新对象时,调用form.is_在视图中有效时,ModelForm/Model中的各个字段不会被验证。根据文档,表单上的is\u valid方法应该首先调用模型的clean\u fields方法

当您提交的表单没有模型实例或数据库中没有新实例时,这似乎不起作用。当我编辑现有对象时,一切正常。在调用模型的clean方法之前,它会很好地触发各个字段中的无效值

当我从模型中删除被重写的clean方法时,一切都很好。创建新对象和编辑现有对象时都会验证单个字段

我还用管理模块的表单对此进行了测试。它有完全相同的行为

所以问题是,为什么在我的模型上重写clean方法会阻止ModelForm在调用clean方法测试其他跨字段内容之前验证各个字段

请注意,我不是在验证ModelForm。所有验证都在模型本身上进行

型号:

class Survey(models.Model):
    from_date = models.DateField(null=False, blank=False, validators=[...])
    to_date = models.DateField(null=False, blank=False, validators=[...])
    (...)    
    def clean(self):
        errors = []
        # At this point I expect self.to_date already to be validated for not null etc.
        # It isn't for new Model instances, only when editing an existing one
        if self.to_date < self.from_date:
            errors.append(ValidationError("..."))
视图以呈现新模型数据输入的空白表单:

(...)
if request.method == "POST":
    survey_form = TestForm(request.POST)
    if '_save' in request.POST:
        if survey_form.is_valid():
            survey_form.save()
            return HttpResponseRedirect(next_url)
    else:
        return HttpResponseRedirect(next_url)
else:
    survey_form = TestForm()

context = {'form': survey_form}
(...)

请显示一些代码。也许在clean中首先调用父类clean方法就可以了?superSurvey、self.Clean通常验证应在表单级别进行。如果您担心管理方面的问题,您可以将您的模型表单也指向管理中的内部使用。@AamirAdnan尝试过,但不起作用。此外,clean不调用clean_字段。工作原理是将superSurvey、self.clean_字段显式地称为表单clean。但这是不必要的。此外,我还发现了奇怪的行为,例如,错误消息报告了所需的值,并且对于空字段不能为null。它似乎运行了两轮验证。另外,它已经可以编辑现有对象了。@AamirAdnan 2我真的不喜欢在表单级别进行这种验证。数据完整性在两个级别上维护:1个数据库检查约束,2个Django模型。在模型上进行验证应该有效吗?
(...)
if request.method == "POST":
    survey_form = TestForm(request.POST)
    if '_save' in request.POST:
        if survey_form.is_valid():
            survey_form.save()
            return HttpResponseRedirect(next_url)
    else:
        return HttpResponseRedirect(next_url)
else:
    survey_form = TestForm()

context = {'form': survey_form}
(...)