6

我是 Django 新手,对表单处理期间的验证步骤有些困惑。我知道默认情况下需要所有表单字段类型(在我的情况下为 ModelForm)。我假设如果未调用表单的 clean 方法而将所需的表单字段留空,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之前不检查所需的值,我会感到惊讶。

4

1 回答 1

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
于 2012-09-16T19:09:18.857 回答