Сохранение текущего URL после неправильного ввода пароля -- Django

def login_view(request):
    if request.method == "POST":
        form = AuthenticationForm(data=request.POST)
        if form.is_valid():
            user= form.get_user()
            login(request, user)
            if "next" in request.POST:
                return redirect(request.POST.get('next'))
            else:
                print('failed to redirect after login')
                return redirect('articles:list')
<form class="site-form" action='.' method="post">
    {% csrf_token %}
    {{ form }}
    {% if request.GET.next %}
        <input type="hidden" name="next" value="{{ request.GET.next }}">
    {% endif %}
    <input type="submit" value="Login">
</form>

Итак, проблема, с которой я сталкиваюсь, заключается в том, что когда я использую параметр @login_required в определенной функции представления в Django. Изначально все работает нормально. URL содержит ?next=/original/url и форма может правильно собрать значение request.POST.next из словаря, который она возвращает, и отправить его обратно в функцию входа.

Затем, если вы правильно ввели пароль, он перенаправляет вас обратно на страницу, на которую вы изначально пытались попасть через значение request.POST.next

ВОПРОС:

Это работает, только если вы введете пароль с первой попытки.

Если вы неправильно вводите пароль, он теряет часть url-тега ?next= и просто переходит на страницу входа по умолчанию. Таким образом, когда вы вводите пароль правильно во второй раз, он не перенаправляет вас обратно на страницу, к которой вы пытались получить доступ (которая была заблокирована требованием входа).

Кто-нибудь знает, как решить эту проблему? Спасибо.

В этом случае необходимо проверить, успешно ли аутентифицирован пользователь, и обработать, если нет. Попробуйте сделать что-то вроде этого:

def login_page(request):
    form = LoginForm(request.POST or None)
    context = {"form": form}
    next_ = request.GET.get('next')
    next_post = request.POST.get('next')
    redirect_path = next_ or next_post or None
    if form.is_valid():
        username = form.cleaned_data.get("username")
        password = form.cleaned_data.get("password")
        user = authenticate(request, username=username, password=password)
        if user is not None:
            login(request, user)
            messages.success(request, f'You are now logged in.')
            if is_safe_url(redirect_path, request.get_host()):
                return redirect(redirect_path)
            else: 
                return redirect("/")
        else:
            messages.warning(request, f'Login error. The email address and/or password is incorrect.')
    return render(request, "accounts/login.html", context)

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