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

Django中login_required的redirect next跳转失效问题求助

解决Django login_required重定向原页面失效的问题

嘿,我仔细看了你的代码,问题主要出在登录表单没有传递next参数到POST请求上,另外还有几个小细节需要调整,下面一步步给你说:

核心问题分析

当用户访问需要登录的页面(比如dashboard)时,Django会自动跳转到你设置的LOGIN_URL,并在URL后面带上?next=目标页面URL的GET参数。你的登录视图在GET请求时确实拿到了这个next_url,但表单提交是POST请求——这时候request.GET.get('next')就拿不到值了,而且你也没把这个next值放到表单里,所以登录成功后next_url是空的,自然就跳转到默认的all_posts页面了。

具体修复步骤

1. 在登录视图中把next_url传递到模板

修改你的user_login视图,在渲染模板时把next_url传进去:

from django.contrib.auth.decorators import login_required
def user_login(request):
    next_url = request.GET.get('next')
    print(next_url)
    if request.method == 'POST':
        form = UserLoginForm(request.POST)
        if form.is_valid():
            cd = form.cleaned_data
            user = authenticate(request, username=cd['username'], password=cd['password'])
            if user is not None:
                login(request, user)
                messages.success(request, 'Login Successful', extra_tags='success')
                # 同时从GET和POST中获取next参数
                next_url = request.GET.get('next') or request.POST.get('next')
                if next_url:
                    return redirect(next_url)
                return redirect('post:all_posts')
            else:
                messages.error(request, 'Wrong Username Or Password', extra_tags='warning')
    else:
        form = UserLoginForm()
    # 把next_url传到模板上下文
    return render(request, 'account/login.html', {'form': form, 'next_url': next_url})

2. 在登录模板中添加隐藏字段传递next

修改你的登录模板login.html,在表单里添加一个隐藏字段,把next_url传递到POST请求中:

{% extends 'base.html' %}
{% block content %}
<form action="." method="post">
    {% csrf_token %}
    {{ form.as_p }}
    <!-- 添加隐藏字段传递next参数 -->
    {% if next_url %}
    <input type="hidden" name="next" value="{{ next_url }}">
    {% endif %}
    <input type="submit" value="Login" class="btn btn-primary">
</form>
{% endblock content %}

3. 修复URL配置的转义问题

注意到你的Account URL里写的是&lt;int:user_id&gt;,这是HTML转义后的字符,要改成Django URL的正确语法:

app_name = 'account'
urlpatterns = [
    path('login/', user_login, name='user_login'),
    path('register/', register, name='user_register'),
    path('logout/', user_logout, name='user_logout'),
    # 修正URL路径的语法
    path('dashboard/<int:user_id>/', dashboard, name='user_dashboard'),
]

验证修复

做完这些修改后,你可以测试一下:

  • 先退出登录,直接访问/account/dashboard/你的用户ID/,会跳转到登录页,此时URL里应该带有?next=/account/dashboard/你的用户ID/
  • 输入正确的账号密码登录,应该会直接跳转到dashboard页面,而不是默认的all_posts页面

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 00:42:38