Логин не работает с новым паролем в django? - PullRequest
0 голосов
/ 02 марта 2020

Я реализую UserCreationForm, и с этим я устанавливаю некоторые значения по умолчанию password1 и password2 для пользователя. После успешного создания он отправляет электронное письмо этому пользовательскому экземпляру, а после щелчка по электронной почте пользователь активирует и перенаправляет на set_user_password просмотр. Вид размещен ниже. Он успешно создает пароль для этого пользователя, но пользователь не может войти с этим вновь созданным паролем. В чем может быть причина?

forms.py

class SetPasswordForm(forms.ModelForm):
    password1 = forms.CharField(widget=forms.PasswordInput, validators=[validate_password])
    password2 = forms.CharField(widget=forms.PasswordInput)

    class Meta:
        model = get_user_model()
        fields = ['password1', 'password2']

    def clean_password2(self):
        password1 = self.cleaned_data.get('password1')
        password2 = self.cleaned_data.get('password2')
        if password1:
            if not password1 == password2:
                raise forms.ValidationError("Sorry the two passwords didn't match")

views.py

def set_user_password(request, pk):
    user = get_object_or_404(get_user_model(), pk=pk)
    form = SetPasswordForm()
    if request.method == 'POST':
        form = SetPasswordForm(request.POST)
        if form.is_valid():
            password = form.cleaned_data.get('password2')
            user.set_password(password)
            user.save()
            messages.success(request, 'Password created successfully.')
            return redirect('login')
    return render(request, 'user_invitation/set_password.html', {'user': user, 'form': form})

urls.py

    path('user/<int:pk>/set/password/', views.set_user_password, name='set_user_password'),

С помощью исходный пароль пользователь может войти в систему, но после сброса пароля он не может войти как с (начального, так и с нового) пароля

1 Ответ

1 голос
/ 02 марта 2020

Я думаю, что если вы напечатаете form.cleaned_data['password2'], вы должны получить пустое значение, потому что вы не возвращаете значение из метода clean_password2. Так что исправьте это:

def clean_password2(self):
    password1 = self.cleaned_data.get('password1')
    password2 = self.cleaned_data.get('password2')
    if password1 and password1 != password2:
           raise forms.ValidationError("Sorry the two passwords didn't match")
    return password2  # <-- here is the fix
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...