Как обновить пароль пользователя в django

У меня проблемы, когда я пытаюсь обновить пароль пользователя в django.

def password(request):
 if request.method=="POST":
    password =request.user.password
    username=request.user.username
    c_password=request.POST["current_password"]
    new_password=request.POST["new_password"]
    r_new_password=request.POST["retype_new_password"]
    if password==c_password:
        if new_password==r_new_password:
            user =User.objects.get(username=username)
            user.set_password(new_password)
            user.save()
            messages.info(request,"Successfully saved")
        else:
            messages.info(request,"PASSWORD DOES NOT MATCH")
    else:
        messages.info(request,"PASSWORD INCORRECT")
    
 return render(request,"security.html")

Когда я ввожу текущий пароль, он выдает ошибку password incorrect. Но когда я ввожу pbkdf2_sha256$320000$Cb4s4nwqKwirdgo50ZdjLH$aeuSP3X+dSZXsv0XJB0XxkpwfsmU+PedMX9Jl50Zark=, пароль становится правильным. мой пароль становится правильным, а пароль пользователя обновляется. Моя проблема в том, что я хотел бы заполнить поле текущего пароля как обычный текущий пароль без получения ошибки.

Не могу комментировать, но Виллем прав, поэтому есть ссылка

Обратитесь к Документации Django не хранит необработанные (простой текст) пароли в модели пользователя
Используйте функцию authenticate вместо использования if password==c_password:.

from django.contrib.auth import authenticate
def password(request):
 if request.method=="POST":
    password =request.user.password
    username=request.user.username
    c_password=request.POST["current_password"]
    new_password=request.POST["new_password"]
    r_new_password=request.POST["retype_new_password"]
    user = authenticate(username=username, password=c_password)
    if user is not None:
        if new_password==r_new_password:
            user =User.objects.get(username=username)
            user.set_password(new_password)
            user.save()
            messages.info(request,"Successfully saved")
        else:
            messages.info(request,"PASSWORD DOES NOT MATCH")
    else:
        messages.info(request,"PASSWORD INCORRECT")
    
 return render(request,"security.html")

Вы используете authenticate(…) [Django-doc] для проверки пароля: это позволит получить алгоритм хэширования и соль, и проверить, совпадают ли хэши, так что вы можете работать с:

def password(request):
    if request.method == 'POST':
        c_password = request.POST['current_password']
        new_password = request.POST['new_password']
        r_new_password = request.POST['retype_new_password']
        user = authenticate(username=request.user.username, password=c_password)
        if user is not None:
            if new_password == r_new_password:
                user.set_password(new_password)
                user.save()
                messages.info(request, 'Successfully saved')
            else:
                messages.info(request, 'PASSWORDS DOE NOT MATCH')
        else:
            messages.info(request, 'PASSWORD INCORRECT')
    return render(request, 'security.html')

Однако существует PasswordChangeView [Django-doc] для изменения пароля: здесь уже реализована логика и используется форма. Вы можете внедрить другой шаблон, например, с:

path(
    'password/change/',
    PasswordChangeView.as_view(template_name='security.html'),
    name='password_change'
)

Note: In case of a successful POST request, you should make a redirect [Django-doc] to implement the Post/Redirect/Get pattern [wiki]. This avoids that you make the same POST request when the user refreshes the browser.


Note: You can limit views to a view to authenticated users with the @login_required decorator [Django-doc].


Note: It is better to use a Form [Django-doc] than to perform manual validation and cleaning of the data. A Form will not only simplify rendering a form in HTML, but it also makes it more convenient to validate the input, and clean the data to a more convenient type.

Вернуться на верх