why django inbuilt auth views not recognizing the

2019-08-26 01:48发布

问题:

I understand that when we need to make the django inbuilt views, parameter specification should be made before the inbuilt view function could use it.

now I want to customize the form for django auth viewpassword_reset_confirm

and in the url, I import my customized form

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

and for the url

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')),

in my form.py i import the original SetPasswordForm that is used as default form by django password_reset_confirm funciton

from django.contrib.auth.forms import SetPasswordForm

and then customize the form

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

as you could see more checking are done for the new_password1

But after trying many times the page is still using the default SetpasswordForm as the default labels for the two password is displayed in my html instead of my customized label(in the html {{form.new_password2.label}} is used to display label) and no additional checking on the new_password1 is done

I have tried to create another MyPasswordSetForm that does not inherit the SetPassordForm and pass this to the password_reset_confirm but it does not make any difference, the default form is still used.

I have googled lot and ask questions on this, seems this is the right way to go, but What could be the problem here?

Thank you very much for helping.

回答1:

Oops, that URL regexp looks wrong wrong wrong:

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})/$  '

It should be:

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})/$'