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

Django中如何为指定页面重写@login_required的登录跳转地址?

Django登录后跳转至指定页面(重写LOGIN_REDIRECT_URL)

要实现用户从checkout页面触发登录后跳转回checkout,而非全局配置的myaccount,核心是利用Django自带的next参数机制,具体步骤如下:

方法一:使用Django自带登录视图(LoginView)

  1. 在登录模板中传递next参数
    在登录页面模板(如login.html)里,添加一个隐藏的next输入框,将访问checkout时携带的next参数传递到登录表单:
<form method="post">
  {% csrf_token %}
  {{ form.as_p }}
  <!-- 传递next参数 -->
  <input type="hidden" name="next" value="{{ request.GET.next }}">
  <button type="submit">登录</button>
</form>

Django的LoginView会自动处理next参数,登录成功后优先跳转到next指定的页面(即checkout),只有当next不存在时,才会使用settings.LOGIN_REDIRECT_URL配置的地址。

方法二:自定义登录视图

如果是自行编写的登录视图,需要手动处理next参数:

  1. 修改登录视图逻辑
    在views.py的登录视图中,登录成功后优先获取next参数,无参数时再使用全局配置:
from django.contrib.auth import authenticate, login
from django.shortcuts import redirect, render
from django.conf import settings

def login_view(request):
    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')
        user = authenticate(request, username=username, password=password)
        
        if user:
            login(request, user)
            # 优先取POST中的next,再取GET中的,最后用全局配置
            next_url = request.POST.get('next') or request.GET.get('next') or settings.LOGIN_REDIRECT_URL
            return redirect(next_url)
        else:
            return render(request, 'login.html', {'error': '用户名或密码错误'})
    else:
        # GET请求时把next参数传给模板
        return render(request, 'login.html', {'next': request.GET.get('next')})
  1. 模板中添加next隐藏输入
    和方法一一致,在登录模板里添加隐藏的next输入框,传递next值。

注意事项

  • Django会自动过滤next参数中的外部域名URL,避免跳转到不安全网站,无需额外处理。
  • 你的checkout视图已添加@login_required装饰器,用户未登录访问checkout时,Django会自动将当前checkout的URL作为next参数附加到登录URL后(如/login/?next=/checkout/),只要登录流程正确处理该参数即可实现需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 07:15:37