Django ModelForm输入约束

时间:2018-10-06 17:41:25

标签: html django python-3.x

我有一些包含多个日期字段的模型,我想让用户能够通过ModelForm输入值,但是我想限制输入的日期值必须大于上一个日期字段,并且小于下一个日期字段

1 个答案:

答案 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,则这些都将自动执行。