Django忽略表单字段required = True

时间:2013-06-02 18:30:16

标签: django django-forms

我有一个带有两个日期字段的表单,都需要:

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}的情况下报告该错误}。

我错过了什么吗?

1 个答案:

答案 0 :(得分:2)

在到达clean之前,已执行字段级别检查 。如果任何这些字段检查失败,则假设clean不会被调用,这是错误的。它总是被调用:否则将如何创建任何表单级验证消息?

您需要使用例如form.cleaned_data.get()保护自己免受KeyError攻击。