You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

什么是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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 14:40:05