Django LoginView设置success_url无效?如何修改登录重定向地址
问题解答:Django LoginView无法通过success_url修改重定向目标
首先直接给结论:你直接设置success_url的方式确实不对,因为Django的LoginView并没有使用success_url属性来处理登录成功后的重定向——它有自己的一套逻辑,甚至重写了get_success_url方法,所以FormMixin里的success_url在这里完全不会生效。
为什么你的代码不生效?
LoginView的默认重定向优先级是这样的:
- 优先读取请求中的
next参数(不管是GET还是POST提交的) - 如果没有
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>
测试建议
- 先去掉模板里的
next隐藏字段,只用方案1的重写方法,测试是否能跳转到指定页面 - 如果想用方案2,打开页面源码检查
next隐藏字段的value是否正确,然后提交表单后看请求里是否携带了next参数
内容的提问来源于stack exchange,提问作者cmanbst
相关产品推荐
相关产品推荐

