Django中如何为指定页面重写@login_required的登录跳转地址?
Django登录后跳转至指定页面(重写LOGIN_REDIRECT_URL)
要实现用户从checkout页面触发登录后跳转回checkout,而非全局配置的myaccount,核心是利用Django自带的next参数机制,具体步骤如下:
方法一:使用Django自带登录视图(LoginView)
- 在登录模板中传递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参数:
- 修改登录视图逻辑
在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')})
- 模板中添加next隐藏输入
和方法一一致,在登录模板里添加隐藏的next输入框,传递next值。
注意事项
- Django会自动过滤
next参数中的外部域名URL,避免跳转到不安全网站,无需额外处理。 - 你的
checkout视图已添加@login_required装饰器,用户未登录访问checkout时,Django会自动将当前checkout的URL作为next参数附加到登录URL后(如/login/?next=/checkout/),只要登录流程正确处理该参数即可实现需求。
内容的提问来源于stack exchange,提问作者arcee123
相关产品推荐
相关产品推荐

