2013-06-02 33 views
2

我有两个日期字段形式,都需要:的Django忽略所需表格字段=真

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,因为当我提交表单不作任何输入由于cleaned_data字典不包含该密钥(这是可以理解的,因为我没有输入任何内容),因此开始动作,但与KeyError崩溃。

我预计要在clean()之前进行实地检查required=True,然后这些标志这两个领域都需要某种形式的条目,并报告该错误不回运行clean()

我错过了什么吗?

回答

2

现场水平检查之前执行clean。如果任何这些现场检查失败,你的假设是clean将不会被调用。它总是被称为:否则将如何创建任何表单级验证消息?

您需要通过使用例如form.cleaned_data.get()来抵御KeyError。

+0

我还是很困惑。我的假设是,当在该特定字段中不输入任何内容时,required = True会触发ValidationError异常。然后这个异常会暂停表单的验证过程的进一步执行并报告一个错误(通过表单)BEFORE Django执行clean()方法... – Roger

+0

但是,这是不正确的“暂停”部分。总是调用'clean',因为它有机会引发自己的验证消息,这可能与其他验证失败没有任何关系:防止出现“口令不匹配”错误会很奇怪只是因为你没有填写完全独立的必填字段。 –

+1

因此,即使字段验证(必需)引发异常,clean()也会被调用?我不想分头发,但是有没有例外,以阻止正常的程序流程,让我们处理异常情况? – Roger