我有一个带有两个日期字段的表单,都需要:
arrival_date = forms.DateField(
required = True,
widget = DateInput(attrs={
"class": "input-small"
}),
)
departure_date = forms.DateField(
required = True,
widget = DateInput(attrs = {
"class": "input-small"
})
)
由于两个日期都涉及更大的上下文中的一些复杂验证,因此表单还有一个clean()
方法,可以对日期执行一些额外的检查:
def clean(self):
cleaned_data = super(NewBookingForm3, self).clean()
arrival_date = cleaned_data["arrival_date"]
departure_date = cleaned_data["departure_date"]
property_object = self.wizard.object.property
try:
validate_booked_dates(arrival_date, departure_date, property_object)
except forms.ValidationError:
del cleaned_data["arrival_date"]
del cleaned_data["departure_date"]
raise
return cleaned_data
现在的问题是显然clean()
方法让Django在字段级别忽略required=True
,因为当我提交表单而没有输入任何内容时clean()
会动作但是崩溃了KeyError
cleaned_data
字典不包含该密钥(这是可以理解的,因为我没有输入任何内容)。
我希望在required=True
之前执行字段级别检查clean()
,然后标记两个字段都需要某种类型的条目并在不运行{{1}的情况下报告该错误}。
我错过了什么吗?
答案 0 :(得分:2)
在到达clean
之前,已执行字段级别检查 。如果任何这些字段检查失败,则假设clean
不会被调用,这是错误的。它总是被调用:否则将如何创建任何表单级验证消息?
您需要使用例如form.cleaned_data.get()
保护自己免受KeyError攻击。