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},
    )
   
Вернуться на верх