Представление для смены пароля работает некорректно

#python #django

#python #django

Вопрос:

Итак, я пытаюсь выяснить, соответствует ли пользователь своему старому паролю, если нет, то он выдаст сообщение с надписью «Ваш старый пароль неверен», но если они соответствуют своему старому паролю, тогда он должен проверить, правильно ли пользователь сопоставил новый и подтвердил пароль, если они этого не сделали, тогда он должен выдать сообщениесообщение «Ваши новые пароли не совпадают», но даже когда я правильно подбираю старый пароль, он всегда говорит «Ваш старый пароль неверен», даже если он правильный.

views.py

 @login_required
def userchange(request):
    if request.method == 'POST':
        # user = User.objects.get(username=request.user.username, password=request.POST['Old password'])
        if User.objects.filter(username=request.user.username, password=request.POST['Old password']).exists():
            if request.POST['New password1'] == request.POST['New password2']:
                User.objects.update_or_create(username=request.user.username, password=request.POST['New password2'])
                return render(request, 'main/change.html', {'error':'Your password has been changed succesfully!'})
            else:
                return render(request, 'main/change.html', {'error':'Your new passwords do not match'})
        else:
            return render(request, 'main/change.html', {'error':'Your old password is incorrect'})
    elif request.method == "GET":
        return render(request, 'main/change.html')
 

change.html

 <h1>Note: You will be logged out</h1>
<h2>{{ error }}</h2>
<form method="POST">
    {% csrf_token %}
    <input type="password" placeholder="Old password" name="Old password">
    <input type="password" placeholder="New password" name="New password1">
    <input type="password" placeholder="Confirm password" name="New password1">
    <button type="submit">Change password</button>
</form>
 

Комментарии:

1. Почему в from есть два name="New password1"> ?

2. Здесь вы назначаете request.POST['New password2'] So в форме New password2 .

3. Я это исправил. Результат все тот же

Ответ №1:

Пароли не хранятся в базе данных в виде обычного текста, поэтому User.objects.filter(username=request.user.username, password=request.POST['Old password']) не будут работать (также у вас уже есть пользователь из request.user зачем фильтровать). Попробуйте использовать check_password вместо этого. Также используется set_password для установки нового пароля:

 user = request.user
old_password = request.POST['Old password']
new_password1 = request.POST['New password1']
new_password2 = request.POST['New password2']
if user.check_password(old_password):
    if new_password1 == new_password2:
        user.set_password(new_password1)
        # rest of code
 

Также в качестве альтернативы попробуйте использовать встроенное представление для смены пароля PasswordChangeView.

Ответ №2:

Что ж, ваша проблема, скорее всего, заключается в том, что приведенный ниже код всегда вычисляет false независимо от того, что вы вводите:

 if User.objects.filter(username=request.user.username, password=request.POST['Old password']).exists():
 

Было бы лучше разбить его и сначала получить объект user, а затем сравнить текущий user.oldpassword с запросом.СООБЩЕНИЕ[‘Old_password’].
Не уверен, как ваша модель выглядит для пользователя, но может сработать что-то вроде приведенного ниже:

 User.objects.get(username = request.user.username)
if User.Old_Password == request.POST['old password']:
    #add your code and finish if statement
 

Что-то вроде описанного выше может сработать для вас самих.