Сохранение текущего 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)