You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django中LoginRequiredMixin登录后重定向错误问题求助

Django登录后跳转回原受限页面的解决方案

问题说明

使用LoginRequiredMixin限制用户访问指定URL时,未登录用户会被重定向到登录页,URL中会携带next(或自定义的redirect_to)参数记录原访问地址,但登录成功后始终跳转到success_url设置的main页面,无法回到原页面。需要实现两种场景:

  • 直接访问登录页:登录后跳转到main
  • 从受限页面跳转登录:登录后跳转回原受限页面

解决思路

核心是在LoginView中重写get_success_url方法,优先读取请求中携带的跳转参数,验证安全性后跳转;如果没有有效跳转参数,再使用默认的success_url。

代码修改

1. 调整LoginView(核心修改)

在views.py中修改LoginView,添加get_success_url方法处理跳转逻辑:

from django.utils.http import is_safe_url
from django.contrib.auth import login
from django.views.generic.edit import FormView
from django.urls import reverse_lazy

class LoginView(FormView):
    form_class = LoginForm
    template_name = "tavern_app/login.html"
    success_url = reverse_lazy("main")
    # 如果使用自定义跳转参数名,这里要和LoginRequiredMixin保持一致,比如:
    # redirect_field_name = 'redirect_to'

    def form_valid(self, form):
        user = form.user
        login(self.request, user)
        return super().form_valid(form)

    def get_success_url(self):
        # 获取请求中的跳转参数
        redirect_to = self.request.GET.get(self.redirect_field_name)
        # 验证跳转地址的安全性,防止恶意跳转
        if redirect_to and is_safe_url(
            redirect_to,
            allowed_hosts=self.request.get_host(),
            require_https=self.request.is_secure()
        ):
            return redirect_to
        # 无有效跳转地址时,使用默认的success_url
        return super().get_success_url()

2. 配置LoginRequiredMixin(可选)

如果使用默认的next参数,CreateSessionBaseView无需修改:

from django.contrib.auth.mixins import LoginRequiredMixin
from django.views.generic import View
from django.shortcuts import render

class CreateSessionBaseView(LoginRequiredMixin, View):
    login_url = '/log-in/'
    # 默认redirect_field_name为'next',可省略
    # redirect_field_name = 'next'

    def get(self, request):
        return render(request, "tavern_app/create_session_base.html")

如果需要自定义跳转参数名(比如redirect_to),则同步修改CreateSessionBaseView:

class CreateSessionBaseView(LoginRequiredMixin, View):
    login_url = 'login'
    redirect_field_name = 'redirect_to'

    def get(self, request):
        return render(request, "tavern_app/create_session_base.html")

同时在LoginView中添加对应的redirect_field_name = 'redirect_to'属性。

原理说明

  • LoginRequiredMixin会将用户原本访问的受限页面地址,通过GET参数(默认next,可自定义)附加到登录页URL中
  • 重写get_success_url后,登录成功时会优先检查该参数,若地址合法则跳转回原页面;否则使用预设的success_url跳转到main页面

内容的提问来源于stack exchange,提问作者selefotsifeM

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 09:32:55