Django手动登录重定向时如何添加next参数实现跳转回原页面
方案1:手动构造带next参数的跳转链接
核心逻辑是用request.get_full_path()获取当前页面的完整路径(包含查询参数),作为next参数的值拼接到登录url后面。为了避免特殊字符转义问题,推荐用urllib.parse.urlencode处理参数:
from django.shortcuts import redirect from django.urls import reverse from django.contrib import messages import urllib.parse def create_something(request): if not request.user.is_authenticated: messages.info(request, '你必须先登录才能创建内容 👀.') # 构造登录页地址,此处的login对应你urls.py中登录路由的name login_path = reverse('login') # 自动处理参数转义,拼接next参数 query_params = urllib.parse.urlencode({'next': request.get_full_path()}) return redirect(f'{login_path}?{query_params}') # 原有业务逻辑 ...
方案2:复用原生login_required逻辑(更推荐)
如果有多个视图都需要类似的登录校验+消息提示,你可以自定义一个装饰器,直接复用Django原生login_required的next参数处理逻辑,不需要自己手动拼接参数,更不容易出错:
from django.contrib.auth.decorators import login_required from django.contrib import messages def login_required_with_msg(view_func): def wrapper(request, *args, **kwargs): if not request.user.is_authenticated: messages.info(request, '你必须先登录才能访问该页面 👀.') # 直接调用原生装饰器,自动处理next参数 return login_required(view_func)(request, *args, **kwargs) return view_func(request, *args, **kwargs) return wrapper # 直接用自定义装饰器修饰视图即可 @login_required_with_msg def create_something(request): # 原有业务逻辑 ...
注意事项
如果你使用的是Django自带的登录视图,默认已经支持next参数的自动跳转;如果是自定义实现的登录逻辑,需要在登录成功后优先判断是否存在合法的next参数,存在则跳转到对应地址,不存在再跳转到默认首页。
内容的提问来源于stack exchange,提问作者Zack Plauché
相关产品推荐
相关产品推荐

