Django PasswordResetDoneView не перенаправляет на вход в систему
У меня есть процедура сброса пароля, вот коды:
Запрос на сброс пароля:
<form method="POST">
{% csrf_token %}
<div class="wrap-input100 validate-input input-group" data-bs-validate="Format email valide requis: ex@abc.xyz">
<a class="input-group-text bg-white text-muted">
<i class="zmdi zmdi-email text-muted" aria-hidden="true"></i>
</a>
<input id="id_email" class="input100 border-start-0 form-control ms-0" type="email" placeholder="Email" name="email" autocomplete="email" maxlength="254">
</div>
<button class="btn btn-primary" type="submit">Envoyer le lien de réinitialisation</button>
</form>
Подтверждение сброса пароля:
<form method="POST">
{% csrf_token %}
<div class="wrap-input100 validate-input input-group" id="Password-toggle">
<a class="input-group-text bg-white text-muted">
<i class="zmdi zmdi-eye text-muted" aria-hidden="true"></i>
</a>
<input class="input100 border-start-0 form-control ms-0" type="password" placeholder="Nouveau mot de passe" id="id_new_password1" name="new_password1">
</div>
<div class="wrap-input100 validate-input input-group" id="Password-toggle">
<a class="input-group-text bg-white text-muted">
<i class="zmdi zmdi-eye text-muted" aria-hidden="true"></i>
</a>
<input class="input100 border-start-0 form-control ms-0" type="password" placeholder="Confirmation du nouveau mot de passe" id="id_new_password2" name="new_password2">
</div>
<div class="container-login100-form-btn">
<button class="login100-form-btn btn-primary" type='submit'>Réinitialiser</button>
</div>
</form>
Просмотр сброса пароля:
def password_reset_request(request):
if request.method == "POST":
password_reset_form = PasswordResetForm(request.POST)
if password_reset_form.is_valid():
data = password_reset_form.cleaned_data["email"]
associated_users = Account.objects.filter(Q(email=data))
if associated_users.exists():
for user in associated_users:
subject = "Demande de changement de mot de passe"
email_template_name = "core/email/password_reset_email.txt"
c = {
"email": user.email,
"domain": EMAIL_DOMAIN,
"site_name": "XXXXXX.XXXX",
"uid": urlsafe_base64_encode(force_bytes(user.pk)),
"user": user,
"token": account_activation_token.make_token(user),
"protocol": EMAIL_PROTOCOL,
}
email = render_to_string(email_template_name, c)
try:
send_mail(
subject,
email,
"info@XXXXXX.XXXX",
[user.email],
fail_silently=False,
)
except BadHeaderError:
return HttpResponse("Invalid header found.")
return redirect("password_reset_done")
password_reset_form = PasswordResetForm()
return render(
request=request,
template_name="core/pwdreset/password_reset.html",
context={"password_reset_form": password_reset_form},
)
URL-адреса сброса пароля:
path("password_reset/", password_reset_request, name="password_reset"),
path(
"password_reset/done/",
auth_views.PasswordResetDoneView.as_view(
template_name="core/pwdreset/password_reset_done.html"
),
name="password_reset_done",
),
path(
"reset/<uidb64>/<token>/",
auth_views.PasswordResetConfirmView.as_view(
template_name="core/pwdreset/password_reset_confirm.html"
),
name="password_reset_confirm",
),
path(
"reset/done/",
auth_views.PasswordResetCompleteView.as_view(
template_name="core/pwdreset/password_reset_complete.html"
),
name="password_reset_complete",
),
Настройки:
[...]
AUTH_USER_MODEL = "core.Account"
LOGIN_REDIRECT_URL = "dashboard"
LOGOUT_REDIRECT_URL = "index"
LOGIN_URL = "login"
LOGOUT_URL = None
[...]
Когда я ввожу новый пароль и подтверждение, страница сбрасывается, не перенаправляет ни на какую другую страницу и не подтверждает, что пароль был изменен или нет.
Я следовал многим руководствам, в которых используется django.contrib.auth
, но это, похоже, не работает.
Вы перенаправляете, когда письмо успешно отправлено. Но сразу после этого вы заново рендерите пустую форму и снова возвращаете render(...). Таким образом, ваш код делает именно то, что вы написали, но это не то, что вы хотите.
Вы не прописали перенаправление для if password_reset_form.is_valid()
:
def password_reset_request(request):
if request.method == "POST":
password_reset_form = PasswordResetForm(request.POST)
if password_reset_form.is_valid():
data = password_reset_form.cleaned_data["email"]
associated_users = Account.objects.filter(Q(email=data))
if associated_users.exists():
for user in associated_users:
subject = "Demande de changement de mot de passe"
email_template_name = "core/email/password_reset_email.txt"
c = {
"email": user.email,
"domain": EMAIL_DOMAIN,
"site_name": "XXXXXX.XXXX",
"uid": urlsafe_base64_encode(force_bytes(user.pk)),
"user": user,
"token": account_activation_token.make_token(user),
"protocol": EMAIL_PROTOCOL,
}
email = render_to_string(email_template_name, c)
try:
send_mail(
subject,
email,
"info@XXXXXX.XXXX",
[user.email],
fail_silently=False,
)
except BadHeaderError:
return HttpResponse("Invalid header found.")
return redirect("password_reset_done")
else:
password_reset_form = PasswordResetForm()
return render(
request=request,
template_name="core/pwdreset/password_reset.html",
context={"password_reset_form": password_reset_form},
)