即使需要的值丢失,Django验证调用clean()

时间:2012-09-16 18:56:08

标签: django forms validation

我是Django的新手,对表单处理过程中的验证步骤感到有些困惑。我知道默认情况下需要所有表单字段类型(在我的情况下是ModelForm)。我假设Django会引发VaidationError,以防所需的表单字段留空,而调用表单的干净方法。

这就是为什么我没有检查是否在以下clean()方法中设置了任何数据:

def clean(self):
    date =  self.cleaned_data.get('date')
    time_start = self.cleaned_data.get('time_start')
    time_end = self.cleaned_data.get('time_end')
    user_type = self.cleaned_data.get('user_type')

    if Event.objects.filter(user_type=user_type, date=date, 
                            time_start__lt=time_start, 
                            time_end__gt=time_start).exclude(pk=self.instance.pk).count():
        raise forms.ValidationError("Overlapping with another event.")

在将所有字段留空时提交表单会导致

  

ValueError:不能将None用作查询值。

如果我删除了clean()方法,我会得到预期的ValidationErrors,因为没有填写必填字段 - 这正是我所期望的clean()方法仍然存在。

知道可能导致这种情况发生的原因吗?如果Django在调用clean之前没有检查所需的值,我会感到惊讶。

1 个答案:

答案 0 :(得分:5)

这很奇怪,因为字段的验证是在调用表单的clean方法之前执行的。此外,字段引发的错误存储在form.my_field.errors中,而从表单的clean方法返回的错误在form.non_field_errors中累积。

以下是以表格形式执行的验证的顺序:

full_clean()
    |
Field clean() [field's built-in clean method]
    |
Form clean_*() [custom validation method for field]
    |
Form clean() [form's clean method]
    |
cleaned_data/errors