Django:LoginView登录后未跳转至原页面,而是重定向至accounts/profile
解决登录后重定向回原页面的问题
问题根源
你当前的问题是模板里的{{ next }}变量没有获取到正确的值,导致登录时next参数为空,Django就会使用默认的重定向地址/accounts/profile。另外CSRF令牌的位置不符合规范,建议调整。
具体修复步骤
1. 修正模板中的next变量引用
Django的LoginView默认会将next参数的值以redirect_field_value的变量名传递到模板上下文,所以需要把模板里的{{ next }}改成{{ redirect_field_value }}:
修改sign-in.html中的隐藏input:
<input type="hidden" name="next" value="{{ redirect_field_value }}">
2. 调整CSRF令牌的位置
把{% csrf_token %}移到form标签内的开头位置,规范写法:
<h1>登录</h1> <form method="post" action="{% url 'sign in' %}"> {% csrf_token %} {{ form.as_p }} <input type="hidden" name="next" value="{{ redirect_field_value }}"> <p> <button type="submit">登录</button> </p> <p>还不是会员?<a href="{% url 'sign up' %}">立即注册</a></p> </form>
3. (可选)显式声明视图的redirect_field_name
虽然默认值就是next,但可以在SignInView里显式声明,让代码逻辑更清晰:
class SignInView(auth_views.LoginView): template_name = 'sign-in.html' redirect_field_name = 'next' # 可选,默认即为该值
4. (可选)自定义next参数验证逻辑
如果遇到特殊路径被Django拦截的情况,可以重写get_success_url方法,自定义站内路径验证规则:
class SignInView(auth_views.LoginView): template_name = 'sign-in.html' def get_success_url(self): next_url = self.request.GET.get('next') or self.request.POST.get('next') # 验证路径为站内合法路径 if next_url and next_url.startswith('/'): return next_url # 无效路径则使用默认重定向地址 return super().get_success_url()
验证流程
- 在
/vinyls/页面点击登录按钮,地址栏应显示/sign-in/?next=/vinyls/ - 输入凭据登录后,会自动跳转回
/vinyls/页面 - 测试
/record_labels/、/events/等其他页面,确认均能正确跳转回原浏览页面
内容的提问来源于stack exchange,提问作者prsnr
相关产品推荐
相关产品推荐

