0

我知道当我们需要制作 django 内置视图时,应该在内置视图功能使用它之前进行参数规范。

现在我想为 django auth 视图自定义表单password_reset_confirm

在网址中,我导入了我的自定义表单

from Myapp.forms import PasswordSetForm
from django.contrib.auth import urls,views

和网址

url(r'^accounts/ ^reset/(?P<uidb36>[0-9A-Za-z]{1,13})-(?P<token>[0-9A-Za-z]{1,13}-[0-9A-Za-z]{1,20})/$  ',
        'django.contrib.auth.views.password_reset_confirm',{'set_password_form':PasswordSetForm},
        name='password_reset_confirm'),
url(r'^accounts/', include('django.contrib.auth.urls')),

在我的 form.py 中,我导入了SetPasswordFormdjango 函数用作默认表单的password_reset_confirm原件

from django.contrib.auth.forms import SetPasswordForm

然后自定义表单

class PasswordSetForm(SetPasswordForm):
    error_messages = {
        'invalid_password': _("Please enter a valid password as instructed"),
        'password_mismatch': _("The two password fields didn't match."),
    }


    #new_password1 = forms.CharField(label=_("New password"),
    #                                widget=forms.PasswordInput)
    #new_password2 = forms.CharField(label=_("New password confirmation"),
    #                                widget=forms.PasswordInput)


    new_password1 = forms.CharField(widget=forms.PasswordInput, min_length=6, label='New Password' )
    new_password2 = forms.CharField(widget=forms.PasswordInput, min_length=6, label='Confirm new password')

    def clean_new_password1(self):
        new_password1 = self.cleaned_data.get("new_password1")

        # password must contain both Digits and Alphabets
        # password cannot contain other symbols
        if new_password1.isdigit() or new_password1.isalpha() or not new_password1.isalnum():
            raise forms.ValidationError(
                self.error_messages['invalid_password'],
                code='invalid_password',
            ) 
        return new_password1

如您所见,对 new_password1 进行了更多检查

但是经过多次尝试页面仍然使用默认的SetpasswordForm作为两个密码的默认标签显示在我的html中而不是我的自定义标签中(在html{{form.new_password2.label}}中用于显示标签)并且没有对new_password1进行额外检查

我试图创建另一个不继承 SetPassordForm 的 MyPasswordSetForm 并将其传递给password_reset_confirm但它没有任何区别,仍然使用默认表单。

我在谷歌上搜索了很多问题并就此提出问题,似乎这是正确的方法,但这里可能有什么问题?

非常感谢您的帮助。

4

1 回答 1

2

糟糕,那个 URL 正则表达式看起来错错了:

r'^accounts/ ^reset/(?P<uidb36>[0-9A-Za-z]{1,13})-(?P<token>[0-9A-Za-z]{1,13}-[0-9A-Za-z]{1,20})/$  '

它应该是:

r'^accounts/reset/(?P<uidb36>[0-9A-Za-z]{1,13})-(?P<token>[0-9A-Za-z]{1,13}-[0-9A-Za-z]{1,20})/$'
于 2013-07-03T07:18:54.730 回答