Проблема с перенаправлением 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']). Надеюсь, это поможет решить вашу проблему.

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