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

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()

验证流程

  1. 在/vinyls/页面点击登录按钮,地址栏应显示/sign-in/?next=/vinyls/
  2. 输入凭据登录后,会自动跳转回/vinyls/页面
  3. 测试/record_labels/、/events/等其他页面,确认均能正确跳转回原浏览页面

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 14:01:02