2

我有一个包含两个日期字段的表单,两者都是必需的:

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()方法使 Djangorequired=True在字段级别忽略,因为当我提交表单而不输入任何内容时,clean()摆动开始但KeyError由于cleaned_data字典不包含该键而崩溃(这是可以理解的,因为我没有输入任何内容) )。

我希望在此required=True之前执行字段级别检查,clean()然后标记两个字段都需要某种类型的条目,并在不运行clean().

我错过了什么吗?

4

1 回答 1

3

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

您需要使用 eg 来保护自己免受 KeyError 的影响form.cleaned_data.get()

于 2013-06-02T18:57:17.177 回答