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

Django LoginView设置success_url无效?如何修改登录重定向地址

问题解答:Django LoginView无法通过success_url修改重定向目标

首先直接给结论:你直接设置success_url的方式确实不对,因为Django的LoginView并没有使用success_url属性来处理登录成功后的重定向——它有自己的一套逻辑,甚至重写了get_success_url方法,所以FormMixin里的success_url在这里完全不会生效。

为什么你的代码不生效?

LoginView的默认重定向优先级是这样的:

  1. 优先读取请求中的next参数(不管是GET还是POST提交的)
  2. 如果没有next参数,才会 fallback 到settings.py里的LOGIN_REDIRECT_URL

而你设置的success_url是FormMixin的通用属性,但LoginView重写了get_success_url方法,完全绕过了这个属性的读取逻辑,所以你的设置根本不会被触发。

正确的解决方法

根据你的需求,有两种可行的方案:

方案1:重写get_success_url方法(推荐,适合固定重定向)

直接在你的MyLoginView里重写这个方法,替换默认的重定向逻辑:

class MyLoginView(LoginView):
    template_name = 'myapp/mytemplate.html'
    
    def get_success_url(self):
        # 直接返回你想要的重定向地址
        return reverse_lazy('myapp:my_success_view')
        
        # 如果想保留`next`参数的优先级(即有next就跳next,没有才跳指定地址),可以改成:
        # next_url = self.request.GET.get('next')
        # return next_url or reverse_lazy('myapp:my_success_view')

这样修改后,登录成功就会直接跳转到你指定的my_success_view,完全忽略LOGIN_REDIRECT_URL(如果没保留next逻辑的话)。

方案2:通过模板的next隐藏字段指定(适合动态重定向)

你模板里已经加了next隐藏字段,但要注意几个关键点:

  • 这个<input>必须放在<form>标签内部,否则表单提交时不会携带这个参数
  • 确保{% url 'myapp:mytemplatename' %}是正确的URL名称,能生成有效的地址(可以在页面源码里查看这个input的value是否正确)
  • 如果同时重写了get_success_url,模板里的next会被方法里的逻辑覆盖,所以两者只能选其一(或者在方法里手动处理next)

比如正确的表单结构应该是这样的:

<form method="post">
    {% csrf_token %}
    <!-- 用户名、密码等表单字段 -->
    
    <div class="d-flex justify-content-center mt-4" style="width: 100%">
        <button type="submit" class="btn btn-primary" style="width: 100%">
            Log In
        </button>
    </div>
    <input name="next" type="hidden" value="{% url 'myapp:mytemplatename' %}"/>
</form>

测试建议

  1. 先去掉模板里的next隐藏字段,只用方案1的重写方法,测试是否能跳转到指定页面
  2. 如果想用方案2,打开页面源码检查next隐藏字段的value是否正确,然后提交表单后看请求里是否携带了next参数

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 07:14:31