Как обновить пароль пользователя в 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_requireddecorator [Django-doc].
Note: It is better to use a
Form[Django-doc] than to perform manual validation and cleaning of the data. AFormwill 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.