Django:如何设置DateField仅接受今天及未来日期

23 投票
4 回答
20767 浏览
提问于 2025-04-16 11:30

我一直在寻找方法,让我的Django表单只接受今天或未来的日期。目前我在前端使用了jQuery的日期选择器,但这里是一个模型表单的字段。

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

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

4 个回答

4

发现 MinValueValidator 对日期也能很好地工作。

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

...

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

另一个有用的解决方案是使用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])
35

你可以在你的表单里添加一个 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

撰写回答