我是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之前没有检查所需的值,我会感到惊讶。
答案 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