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

mzu*_*mzu 5 forms django validation

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

这就是为什么我没有检查是否在以下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.")
Run Code Online (Sandbox Code Playgroud)

在将所有字段留空的情况下提交表单会导致a

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

如果我删除我的clean()方法,我将得到预期ValidationErrors的不填写必填字段 - 这是我所期望的clean()方法仍然存在.

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

thi*_*nom 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
Run Code Online (Sandbox Code Playgroud)