覆盖表单的clean方法来自定义错误消息

时间:2017-08-02 09:35:49

标签: python django forms override

我无法覆盖内置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可以正常工作。

2 个答案:

答案 0 :(得分:2)

<a href="/Home/KitapGoruntule">Kitapları Görüntüle</a> 检查SetPasswordFormnew_password1clean_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