我在网上花了很多年,如何覆盖django中的change_password表单。我创建了表单,我可以成功更改密码。现在我想在页面上显示我的错误。 (顺便说一下,我正在使用django-registration。)
问题是我必须更改错误消息。在我的模板中,我使用此函数来显示new_password1错误:
{% if form.new_password1.errors %}
<div class="error_message"> blah </div>
{% endif %}
但它包含所有new_password1错误。我查看了文档,发现CharField只有reqiured,max和min。我需要检查new_password1的每个特定错误(确认错误,所需错误和最小值,最大值)并生成我自己的错误消息。由于CharField没有匹配的关键字,我在forms.py中尝试了一个干净的方法,如下所示:
def clean_password2(self):
if 'new_password1' in self.cleaned_data and 'new_password2' in self.cleaned_data:
if self.cleaned_data['new_password1'] != self.cleaned_data['new_password2']:
raise forms.ValidationError(_(u"no match"))
return cleaned_data
最后,我不知道如何在我的模板中检查这个clean_password2验证。当我写注册页面时,我可以通过循环错误来显示我的所有错误。它显示所有重写错误。这次它不起作用。所以我的问题是:
1-如何检查模板中的所有特定错误?比如form.new_password1.required.errors
2-如何显示此clean_password2消息?
答案 0 :(得分:2)
在django-speak中,你所指的是视图是模板。这相当令人困惑!
更新:我看到您定义了clean_password2
功能,但您正在检查名为new_password1
,new_password2
的字段。
除非您有一个名为password2
的字段,否则 是您的clean方法正在验证的字段。
clean_password2
生成{{ form.password2.errors }}
的消息,但对我而言,听起来您没有名为password2
的字段。
将方法名称更改为clean_new_password2
。
{% if form.new_password1.errors %}{{ form.new_password1.errors }}{% endif %}
{% if form.new_password2.errors %}{{ form.new_password2.errors }}{% endif %}
每个字段的表单字段清理工作..您可以访问字段对象的错误。
答案 1 :(得分:0)
与@Yuji一样,请在模板中使用{% if form.non_field_errors %}
。
现在只谈一下可用性。对于用户注册和密码更改表单,您可以预期的唯一非字段错误将是密码不匹配,因此与您最初打印非字段错误的其他表单不同,对于这些表单,打印是有意义的两个密码输入字段之前的一个非字段错误,可能将它们包装在具有红色背景的父级中,以使两个字段的值相关并且错误涉及两个字段,而不是形式一般。