Проблема с перенаправлением Django на ранее посещенную страницу
Я пытаюсь обновить представление входа в систему. На данный момент, если кто-то пытается ввести http://127.0.0.1:8000/articles/, то пользователь перенаправляется на http://127.0.0.1:8000/ (страница входа) и после успешного входа, он перенаправляется на http://127.0.0.1:8000/home.
Я хочу перенаправлять пользователей на страницу, которую они пытались посетить до входа в систему. Так, если кто-то попытается посетить http://127.0.0.1:8000/articles, то после входа в систему сайт должен перенаправить его на страницу статей, а не на home.
Вот что я пробовал:
views.py
class UpdatedLoginView(LoginView):
form_class = LoginForm
template_name = 'user/login.html'
redirect_field_name='main/homepage.html'
def post(self, request):
form = self.form_class(request.POST)
if form.is_valid():
if 'next' in request.POST:
return redirect(request.POST['next'])
login.html
<form method="post" class="login-form background" novalidate>
{% csrf_token %}
{{ form|crispy }}
{% if request.GET.next %}
<input type="hidden" name="next" value="{{request.GET.next}}" />
{% endif %}
<button type="submit" class="text-center mx-auto border-0 join-btn col-sm-12 col-md-6 main-btn">Login</button>
<a href="{% url 'login' %}?next={{request.get_full_path|urlencode}}">Login test</a> // this is just a test element, I want to have button in my form
</form>
Мой вопрос заключается в том, как модифицировать UpdatedLoginView и форму, чтобы перенаправлять пользователей на ранее посещенную страницу. Код, который я пробовал, взят из здесь.
Я использовал обычный View вместо LoginView. Вы можете проверить мой код ниже.
class SignIn(View):
def get(self, request, *args, **kwargs):
next_url = request.GET.get('next')
form = SignInForm()
return render(request,'accounts/login.html', {"form":form, "next":next_url})
def post(self, request, *args, **kwargs):
form = SignInForm(request.POST)
if form.is_valid():
if request.method == 'POST':
email = request.POST.get('email')
password =request.POST.get('password')
user = authenticate(request, email=email, password=password)
if user is not None :
login(request, user)
next_url = request.POST.get('next')
if next_url != "None":
return HttpResponseRedirect(next_url)
return redirect('home')
else:
messages.info(request, 'Username or password is incorrect')
return render(request, 'home/index.html', {"form":form})
И я просто добавляю скрытое поле ввода в свой шаблон:
<input type="hidden" name="next" id="next" value="{{ next }}">
Я считаю, что HTTP_REFERER можно использовать для получения ссылки перенаправления предыдущей страницы. Попробуйте использовать
referer = request.META.get("HTTP_REFERER")
для хранения url предыдущей страницы в качестве переменной. Затем, когда пользователь успешно войдет в систему, вы можете вызвать return HttpResponseRedirect(referer) вместо return redirect(request.POST['next']). Надеюсь, это поможет решить вашу проблему.