如何让Django的form.errors仅显示错误信息而非关联输入字段
Django表单密码匹配验证:仅显示错误信息的解决方案
问题说明
使用Django表单验证密码是否匹配时,验证逻辑有效,但{{ form.errors }}会附带关联输入字段的标签;尝试遍历字段错误(field.errors)又无法获取clean()方法中添加的全局错误,希望仅显示错误信息,不包含字段标签。
现有代码
forms.py 验证代码
def clean(self): super(Signup, self).clean() password = self.cleaned_data.get("password") password2 = self.cleaned_data.get("password2") username = self.cleaned_data.get("username") email = self.cleaned_data.get("email") avatar = self.cleaned_data.get("avatar", False) if password != password2: self.errors[""] = self.error_class(["Password mismatch"])
模板代码
<div> {% for field in form %} {% for error in field.errors %} <p> <ul> <li>{{ error }}</li> </ul> </p><br> {% endfor %} {% endfor %} </div>
解决方案
步骤1:规范添加全局非字段错误
Django推荐使用add_error()方法添加全局错误,而非直接操作self.errors字典,这样错误会被归类到非字段错误集合中,便于模板单独渲染。修改forms.py的clean()方法:
def clean(self): # Python 3 可直接使用 super() 省略类名 super().clean() password = self.cleaned_data.get("password") password2 = self.cleaned_data.get("password2") if password != password2: # 第一个参数传None,表示添加全局非字段错误 self.add_error(None, "Password mismatch")
步骤2:模板中单独渲染非字段错误
在模板中通过form.non_field_errors获取全局错误,单独渲染即可避免字段标签:
<div> <!-- 渲染全局非字段错误(如密码不匹配) --> {% for error in form.non_field_errors %} <p> <ul> <li>{{ error }}</li> </ul> </p><br> {% endfor %} <!-- 渲染字段级错误(如用户名格式错误等) --> {% for field in form %} {% for error in field.errors %} <p> <ul> <li>{{ error }}</li> </ul> </p><br> {% endfor %} {% endfor %} </div>
备选方案(兼容旧写法)
如果坚持使用原有的self.errors[""]方式添加错误,可在模板中遍历form.errors时筛选空键对应的错误:
<div> <!-- 渲染空键对应的全局错误 --> {% for key, errors in form.errors.items %} {% if key == "" %} {% for error in errors %} <p> <ul> <li>{{ error }}</li> </ul> </p><br> {% endfor %} {% endif %} {% endfor %} <!-- 渲染字段级错误 --> {% for field in form %} {% for error in field.errors %} <p> <ul> <li>{{ error }}</li> </ul> </p><br> {% endfor %} {% endfor %} </div>
内容的提问来源于stack exchange,提问作者Olasubomi
相关产品推荐
相关产品推荐

