如何正确验证Django表单中的日期字段?
我对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:',
,以过滤掉一些数据。我不希望
到的日期晚于今天的日期。
我很难理解为什么当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