我需要覆盖 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
最佳答案
在 Django 中,当您调用 super(MyForm, self).clean()
时,父类(super class)仅在数据已经有效时才填充 cleaned_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"))
关于python - Django Forms 中日期字段的清理方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23900432/