我无法覆盖内置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
不会打印用户输入的password2值。
我在这段代码中做错了什么?!什么是自定义错误消息的最佳方式?
P.S。在视图中使用原始的SetPasswordForm可以正常工作。
答案 0 :(得分:2)
<a href="/Home/KitapGoruntule">Kitapları Görüntüle</a>
检查SetPasswordForm
和new_password1
在clean_new_password2
方法中匹配。
如果密码不匹配,则new_password2
中不会包含new_password2
,因此您无法使用self.cleaned_data
方法访问密码。
如果要覆盖不匹配密码的错误消息,则在clean
dict中设置它是正确的方法。然后,我会从您的表单中删除error_messages
方法。
如果您需要为每个字段添加不同的clean
错误消息,可以使用required
方法进行设置。
__init__
答案 1 :(得分:1)
当您调用表单超级方法def clean_new_password2(self)
的clean方法时,所有就绪都被调用,因此self.cleaned_data['new_password2']
为空您需要覆盖表单中的clean_new_password2,查找源isLocationOnEdge()
class MySetPasswordForm(SetPasswordForm):
def clean_new_password2(self):
password1 = self.cleaned_data.get('new_password1')
password2 = self.cleaned_data.get('new_password2')
if password1 and password2:
if password1 != password2:
raise forms.ValidationError(
self.error_messages['password_mismatch'],
code='password_mismatch',
)
return password2