什么是non_field_errors?使用forms.Form与ModelForm时的相关问题
Django中form.non_field_errors详解及问题排查
什么是non_field_errors?
这是Django表单里专门存放不属于任何单个字段的全局错误集合,常见来源包括:
- 表单类中
clean()方法抛出的校验错误(比如多个字段联合校验不通过,比如密码和确认密码不匹配) - ModelForm关联的模型中,模型级
clean()方法抛出的错误 - 表单处理流程中产生的、无法关联到具体字段的全局错误
为什么你的模板代码里non_field_errors没内容?
{{ form.errors }}会输出所有错误——包括每个字段单独的校验错误(比如clean_fields()产生的),以及non_field_errors里的全局错误。你看不到non_field_errors的核心原因是:
当前表单触发的错误全是字段级错误,没有触发任何表单级的全局错误,所以form.non_field_errors是空的。
如果想验证,你可以给表单加一个表单级的校验方法,比如:
class ExampleForm(forms.Form): password = forms.CharField(widget=forms.PasswordInput) confirm_pwd = forms.CharField(widget=forms.PasswordInput) def clean(self): cleaned_data = super().clean() pwd = cleaned_data.get("password") confirm_pwd = cleaned_data.get("confirm_pwd") if pwd and confirm_pwd and pwd != confirm_pwd: raise forms.ValidationError("两次密码输入不一致") return cleaned_data
当你提交两次不一致的密码时,form.non_field_errors就会包含这个错误,你的模板代码就能正常显示内容了。
与form.errors的区别
form.errors:是一个字典结构,键是字段名(对应该字段的错误),特殊键__all__对应non_field_errors里的全局错误;直接输出会展示所有错误form.non_field_errors():专门提取form.errors中__all__对应的错误集合,只展示全局非字段错误
内容的提问来源于stack exchange,提问作者aaaa
相关产品推荐
相关产品推荐

