在覆盖Model上的clean()时,Django ModelForm单个字段未经过验证

时间:2014-01-18 18:01:06

标签: django validation model field modelform

我正在使用标准的Django模型和ModelForms。

在模型上,我重写clean()方法以检查组合中的2个字段是否有效。我在其他字段上定义了validators[],而不是null等。

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

当我尝试通过表单创建新对象时,当我在form.is_valid()中调用is_valid()时,模型框架/模型中的个别字段未经过验证视图。根据文档(https://docs.djangoproject.com/en/1.6/ref/models/instances/#validating-objects),表单上的clean_fields()方法应该调用模型的clean()方法(第一个)。

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

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

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

所以问题是,为什么覆盖模型上的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("...")) 方法来测试其他跨字段的东西???

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

型号:

class TestForm(ModelForm):
    class Meta:
        model = Survey

的ModelForm:

(...)
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}
(...)

查看(为新模型数据条目呈现空白表单):

{{1}}

0 个答案:

没有答案