重写窗体的clean方法以自定义错误消息

2024-10-06 12:39:07 发布

您现在位置:Python中文网/ 问答频道 /正文

重写内置Django表单(django.contrib.auth.SetPasswordForm)的clean方法时遇到问题。此表单有两个字段:新密码1和新密码2。在

所以在我的视图.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'))

在我的表单.py:我想定义自己的clean方法来显示自定义的错误消息。我是这样写的MySetPasswordForm

^{pr2}$

问题是当用户输入的重复密码错误时,它没有得到"Missmatch" error,而是给出了"enter pass2"!另外,print password2不打印用户输入的password2值。在

我在这段代码里做错了什么?!定制错误消息的最佳方法是什么?在

另外,在视图中使用原始的SetPasswordForm可以正常工作。在


Tags: 方法pycleantokennone视图表单request
2条回答

当您调用表单超级方法的clean方法时,def clean_new_password2(self)all ready被调用,因此{}为空,您需要重写表单中的clean_new_password2,查找源auth forms

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

SetPasswordForm检查new_password1和{}在{a1}方法中是否匹配。

当密码不匹配时,new_password2不包含在self.cleaned_data中,因此您无法在clean方法中访问它。

如果您想覆盖不匹配密码的错误消息,那么在error_messagesdict中设置它是正确的方法。然后我将从表单中删除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!")

相关问题 更多 >