Django:如何将DateField设置为仅接受Today&未来日期

时间:2011-02-09 06:34:23

标签: python django django-forms datefield

我一直在寻找将Django表单设置为仅接受今天或未来日期的方法。我目前在前端有一个jQuery日期选择器,但这里是模型表单的表单字段。

感谢您的帮助,非常感谢。

date = forms.DateField(
    label=_("What day?"),
    widget=forms.TextInput(),
    required=True)

4 个答案:

答案 0 :(得分:27)

您可以在表单中添加clean()方法,以确保日期不是过去的。

import datetime

class MyForm(forms.Form):
    date = forms.DateField(...)

    def clean_date(self):
        date = self.cleaned_data['date']
        if date < datetime.date.today():
            raise forms.ValidationError("The date cannot be in the past!")
        return date

请参阅http://docs.djangoproject.com/en/dev/ref/forms/validation/#cleaning-a-specific-field-attribute

答案 1 :(得分:5)

另一个有用的解决方案是使用validators关键字参数将验证绑定到字段。这是保持表单代码清晰并允许重用验证逻辑的便捷方法。例如

def present_or_future_date(value):
    if value < datetime.date.today():
        raise forms.ValidationError("The date cannot be in the past!")
    return value

class MyForm(forms.Form):
    date = forms.DateField(...
                           validators=[present_or_future_date])

答案 2 :(得分:2)

如果您使用的是Django 1.2+并且您的模型将始终强制执行此规则,您还可以查看model validation。优点是任何基于模型的模型都将自动使用此验证。

答案 3 :(得分:0)

发现 MinValueValidator 也适用于日期。

import datetime
from django.core.validators import MinValueValidator
from django.db import models

...

some_date = models.DateField(validators=[MinValueValidator(datetime.date.today)])