Django .contrib.auth.authenticate не удается, когда я обновляю поле user.email - Работал с предыдущими учетными данными перед обновлением электронной почты - PullRequest
0 голосов
/ 09 февраля 2020

Я создал форму, в которой зарегистрированные пользователи могут менять свой адрес электронной почты. После сохранения нового сообщения электронной почты, похоже, нет соответствующего запроса для комбинации адрес электронной почты и пароль. Я проверил запись базы данных для указанного c пользовательского экземпляра, и электронная почта была изменена, как и ожидалось. Даже когда я использовал django.contrib.auth.authenticate для сопоставления электронной почты / пароля, он не мог совпадать. Что я делаю неправильно? Ниже приведены форма и представление, которые я использовал:

Forms.py

class UpdateEmailForm(forms.ModelForm):
    password = forms.CharField(widget=forms.PasswordInput())
    new_email = forms.EmailField()

    class Meta:
        model = User
        fields = ['new_email', 'password']

    def clean(self):

        cleaned_data = self.cleaned_data
        old_password = cleaned_data.get('password')

        if not check_password(old_password, self.instance.password):
            raise forms.ValidationError('Incorrect password. Please try again.')

        return cleaned_data

Views.py

def user_login(request):
    form = LoginForm(request.POST)
    context = {'form': form}

    if request.POST.get('user_login'):

        email = request.POST.get('email')
        password = request.POST.get('password')
        user = authenticate(email=email, password=password)

        if user is not None:
            login(request, user)

            return redirect('profile')
        else:
            messages.error(request, 'Email and Password does not match.')
            return redirect('login')

    return render(request, 'users/login.html', context)

Ниже я рассматриваю новую форму электронной почты data @login_required def profile (request): ... elif request.POST.get ('update_email'): data = Customer.objects.get (email = request.user.email) email_form = UpdateEmailForm (request.POST, instance = request.user)

        if email_form.is_valid():
            email_form.save()
            email = request.POST.get('new_email')
            user = User.objects.get(email=request.user.email)
            user.email = email
            data.email = email
            data.save()
            user.save()
            messages.success(request, 'Your account has been updated successfully')
            return redirect('profile')
        else:
            return render(request, 'users/profile.html', {'data': data, 'email_form': email_form})

1 Ответ

0 голосов
/ 10 февраля 2020

Я исправил проблему, создав новое поле с именем confirm_password вместо использования фактического поля password. Пароль изменяется или не сохраняется, когда я сохраняю форму, используя поле фактического пароля

Class UpdateEmailForm(forms.Forms.ModelForm):
    ...
    confirm_password = models.CharField(widget=forms.PasswordInput())
    class Meta:
        fields = ['confirm_password', 'new_email']
...