我无法覆盖内置 Django 表单 ( django.contrib.auth.SetPasswordForm ) 的干净方法。此表单有两个字段:new_password1 和 new_password2。
所以在我的 views.py 中,我调用了自定义表单 ( MySetPasswordForm
):
def reset_confirm(request, uidb64=None, token=None):
return password_reset_confirm_delegate(request,
template_name='app/reset_confirm.html',
set_password_form = MySetPasswordForm, uidb64=uidb64,
token=token, post_reset_redirect=reverse('main_page'))
在我的 forms.py 中:我想定义我自己的 clean 方法来显示我自定义的错误消息。我是这样写的MySetPasswordForm
:
from django.contrib.auth.forms import SetPasswordForm
class MySetPasswordForm(SetPasswordForm):
error_messages = { 'password_mismatch': _("Missmatch!"), }
def clean(self):
password1 = self.cleaned_data.get('new_password1', '')
password2 = self.cleaned_data.get('new_password2', '')
print password1 #prints user's entered value
print password2 #prints nothing!!
print self.data['new_password2'] #prints user's entered value
if password1 == '':
self._errors["new_password1"] = ErrorList([u"enter pass1!"])
if password2 == '':
self._errors["new_password2"] = ErrorList([u"enter pass2"])
elif password1 != password2:
raise forms.ValidationError(
self.error_messages['password_mismatch'],
code='password_mismatch',
)
return self.cleaned_data
问题是当用户输入重复密码错误时,不是得到"Missmatch" error
,而是给出"enter pass2"
!也print password2
不会打印用户的密码2输入的值。
我在这段代码中做错了什么?!定制错误消息的最佳方法是什么?
ps 在视图中使用原始 SetPasswordForm 工作正常。
在SetPasswordForm
将检查new_password1
和new_password2
匹配的clean_new_password2
方法。
当密码不匹配时,new_password2
不包含在 中self.cleaned_data
,因此您无法在clean
方法中访问它。
如果您想覆盖密码不匹配的错误消息,那么在error_messages
dict 中设置它是正确的方法。然后我会clean
从您的表单中删除该方法。
如果您需要required
为每个字段提供不同的错误消息,您可以在__init__
方法中设置它。
class MySetPasswordForm(SetPasswordForm):
error_messages = {
'password_mismatch': _("Missmatch!"),
'required': _("Please enter a password"), # If you do not require the fieldname in the error message
}
def __init__(self, *args, **kwargs):
super(MySetPasswordForm, self).__init__(*args, **kwargs)
self.fields['new_password1'].error_messages['required'] = _("enter pass1!")
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句