我正在使用标准的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}}