Django表单日期字段的清理方法
我需要重写我Django表单中的clean()
方法,以便同时检查两个日期字段:一个是开始日期(begin_date),另一个是结束日期(end_date)。我想确认结束日期是否晚于开始日期,以及开始日期是否晚于现在。
问题是,当这两个字段中有一个为空或者无效时,我会遇到一个异常(KeyError)。我希望能得到一个简单的错误提示,就像处理空的字符字段时那样。
我本以为可以在这里找到答案:Django self.cleaned_data 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
2 个回答
2
这样做怎么样
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")
这个代码会在使用这两个值之前,先检查它们是否都存在。如果其中一个或两个值缺失,就会返回一个合适的错误信息。
3
在Django中,当你调用 super(MyForm, self).clean()
时,父类只会在数据有效的情况下填充清理后的数据。这就是为什么文档中使用 get
方法的原因(https://docs.djangoproject.com/en/dev/ref/forms/validation/#cleaning-and-validating-fields-that-depend-on-each-other)。
如果你想比较日期时间对象,可以使用下面的代码来确保日期字段是正确的:
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"))