我有一些包含多个日期字段的模型,我想让用户能够通过ModelForm输入值,但是我想限制输入的日期值必须大于上一个日期字段,并且小于下一个日期字段
答案 0 :(得分:1)
您可以通过覆盖表单的clean
函数来添加额外的验证,例如:
class FooForm(forms.Form):
date1 = forms.DateField()
date2 = forms.DateField()
date3 = forms.DateField()
def clean(self):
cleaned_data = super().clean()
date1 = cleaned_data.get('date1')
date2 = cleaned_data.get('date2')
date3 = cleaned_data.get('date3')
if not (date1 <= date2 <= date3):
raise forms.ValidationError('Date fields should be ordered')
return cleaned_data
如果此约束仍然存在于模型中,则覆盖模型的clean
函数会更优雅:
from django.core.exceptions import ValidationError
class Foo(models.Model):
date1 = models.DateField()
date2 = models.DateField()
date3 = models.DateField()
def clean(self):
if not (self.date1 <= self.date2 <= self.date3):
raise ValidationError('Date fields should be ordered')
return cleaned_data
请注意,保存模型时不会进行模型清理,但是ModelForm
将调用模型上的clean
函数。因此,仍然可以创建约束不成立的Foo
对象。但是,例如,如果您要构造多个FooForm
,则这些都将自动执行。