我需要覆盖我的Django表单的clean()
方法来测试两个日期字段:begin_date和end_date(是开始日期之后的结束日期,是现在的开始日期)。< / p>
问题是,当这两个字段中的一个为空或无效时,我得到一个异常(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
答案 0 :(得分:3)
在Django中,当您调用super(MyForm, self).clean()
超类时,如果数据已经有效,则仅填充cleaning_data,这就是文档中使用get
方法(https://docs.djangoproject.com/en/dev/ref/forms/validation/#cleaning-and-validating-fields-that-depend-on-each-other)的原因。
由于您不想将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"))
答案 1 :(得分: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")
在尝试使用它们之前检查是否存在这两个值,如果缺少一个或两个值,则返回一个合适的错误消息。