如何正确验证Django表单中的日期字段?

如何正确验证Django表单中的日期字段?,django,django-forms,Django,Django Forms,我对Django表单非常陌生,我正在尝试制作一个非常简单的表单,从和到日期中选择一个,以过滤掉一些数据。我不希望到的日期晚于今天的日期。 我很难理解为什么当clean\u to\u date失败,即to日期晚于今天时,clean\u datadict只有from\u data class DateSelect(forms.Form): from_date = forms.DateTimeField( label='From:',

我对Django表单非常陌生,我正在尝试制作一个非常简单的表单,从和到日期中选择一个
,以过滤掉一些数据。我不希望
到的日期晚于今天的日期。 我很难理解为什么当
clean\u to\u date
失败,即
to
日期晚于今天时,
clean\u data
dict只有
from\u data

class DateSelect(forms.Form):
    from_date = forms.DateTimeField(
                    label='From:',
                    input_formats=['%d/%m/%Y'],
                    required=False)

    to_date = forms.DateTimeField(
                    label='To:', 
                    input_formats=['%d/%m/%Y'],
                    required=False)


    def clean_to_date(self):
        data = self.cleaned_data['to_date']

        if data != None and data > datetime.today():
            raise forms.ValidationError(
                    """
                    \'to\' date cannot be later than today.
                    """)
这是我在html模板中的一段代码,所以当我点击OK时,我只希望它刷新并显示过滤后的数据

<form action="/admin/report/latest-uploads/" method="post">
    {% csrf_token %}
    {{ form }}
    <input type="submit" value="OK">
</form>

在您的示例中,您正在检查
None
,但可以在表单定义中将其设置为
required=True
。 在清理过程中非常重要的一点是,每个def clean_u2;()函数都需要返回一个清理后的值或相同的值(如果可以的话)

:

回到你的代码:

def clean_to_date(self):
    data = self.cleaned_data['to_date']
    if data > timezone.now().date():
        raise forms.ValidationError("'to' date cannot be later than today.")
    return data
UPD: 此外,您必须使用时区而不是日期时间。
来自django.utils导入时区

时区.now().date()
替换检查代码。

请分享您的看法function@PruthviBarot刚刚编辑。我一直在避免为一个小问题写太长的帖子。我不使用
required=True
的唯一原因是因为可以将from_date和to_date设置为空,因为使用这些日期的筛选函数在过去7天内都有默认值进行筛选,例如,如果这两个字段都为空。啊哈!好的,没问题,在
if
-
elif
-
else
块中使用不同的值处理您的案例,并且每当我在我的
clean\u to\u date
中使用
return data
并且我的
to\u date
大于今天的日期时,总是返回已清理的数据['field\u nane']['to_date']
KeyError:'to_date'
您可以通过在
clean_to_date
函数的开头打印它的值来调试您在
self.cleaned_data
中拥有的数据。您有什么问题吗?当出现任何异常时,您的
if表单是否有效():
!=
True
。因此,您没有处理此类情况的任何处理程序。您需要准备一个包含错误的答案,以向用户显示。有关详细信息,您可以使用
表单。错误
    # Always return a value to use as the new cleaned data, even if
    # this method didn't change it.
def clean_to_date(self):
    data = self.cleaned_data['to_date']
    if data > timezone.now().date():
        raise forms.ValidationError("'to' date cannot be later than today.")
    return data