Python Django表单中日期字段的Clean方法
我需要重写Django表单的Python Django表单中日期字段的Clean方法,python,django,datetime,Python,Django,Datetime,我需要重写Django表单的clean()方法来同时测试两个日期字段:开始日期和结束日期(结束日期晚于开始日期,开始日期晚于现在) 问题是,当这两个字段中的一个为空或无效时,我得到了一个异常(KeyError)。我想得到一个简单的错误表单,就像我得到的空字符域一样 我很肯定能在这里找到答案:但我没有 代码如下: class MyForm(forms.Form): begin_date = forms.DateField() end_date = forms.DateField()
clean()
方法来同时测试两个日期字段:开始日期和结束日期(结束日期晚于开始日期,开始日期晚于现在)
问题是,当这两个字段中的一个为空或无效时,我得到了一个异常(KeyError)。我想得到一个简单的错误表单,就像我得到的空字符域一样
我很肯定能在这里找到答案:但我没有
代码如下:
class MyForm(forms.Form):
begin_date = forms.DateField()
end_date = forms.DateField()
#...
def clean(self):
cleaned_data = super(MyForm, self).clean()
errors = []
begin_date = cleaned_data['begin_date']
end_date = cleaned_data['end_date']
#...
# Test 1
if begin_date < date.today():
errors.append(forms.ValidationError(
"La date de début doit être postérieure à la date actuelle"))
# Test 2
if end_date < begin_date:
errors.append(forms.ValidationError(
"La date de fin doit être posétieure à la date de début"))
if errors:
raise forms.ValidationError(errors)
return cleaned_data
类MyForm(forms.Form):
begin\u date=forms.DateField()
end_date=forms.DateField()
#...
def清洁(自清洁):
cleaned_data=super(MyForm,self).clean()
错误=[]
开始日期=已清理的数据[“开始日期”]
结束日期=已清理的数据[“结束日期”]
#...
#测试1
如果开始日期<日期.今天():
错误。追加(forms.ValidationError)(
“约会,但在约会后做什么?”)
#测试2
如果结束日期<开始日期:
错误。追加(forms.ValidationError)(
“日期是指日期,但不包括日期”))
如果出现错误:
引发表单。验证错误(错误)
返回已清除的数据
怎么样
if all([d in cleaned_data for d in ['begin_date', 'end_date']]):
# your code
else:
raise forms.ValidationError("A start date and end date are required")
这将在尝试使用这两个值之前检查它们是否存在,如果其中一个或两个值都丢失,将返回一条适当的错误消息。在Django中,当您调用
super(MyForm,self).clean()
时,超类仅在数据已经有效的情况下才会填充清理后的数据,这就是为什么在文档中使用get
方法的原因()
由于不希望同时比较datetime对象,请使用以下代码确保日期字段正确:
if 'begin_date' in cleaned_data.keys():
begin_date = cleaned_data['begin_date']
else:
begin_date = None
errors.append(forms.ValidationError(
"Bad start date format or empty"))
你的
cleaned\u data=super(DealForm,self).clean()可以吗?因为类的名称是MyForm
notDealForm
是的,对不起,我在中更改了代码以使其简单(编辑可以)。我在另一篇文章中也看到了这一点。但问题是cleaned\u data.get('begin\u date')
返回一个字符串(不是日期),然后我无法执行类似于begin\u date
的操作。在这种情况下,您可以尝试先询问键是否存在cleaned\u data.keys()中的'begin\u date':
使用cleaned\u data['begin\u date']
的尝试将字符串转换为datetime,但我确信清理后的数据返回datetime对象谢谢,这正是我需要的。让我编辑您的答案以添加代码,我会将其标记为已接受。再次感谢。谢谢。但是,这不会处理无效数据,如2014/13/56