Django登录后重定向至指定页面问题求助
解决Django审批链接跳转问题
问题原因
你当前使用的@user_passes_test(is_mbcadmin, login_url="/login/")装饰器逻辑是:用户未通过权限校验时跳转到登录页,而登录成功后Django默认会跳转到settings.LOGIN_REDIRECT_URL(通常是仪表盘),而非原本请求的审批链接。同时这个装饰器也不符合你“未登录/无权限直接跳抱歉页”的需求。
解决方案
方法一:自定义权限校验装饰器(推荐,贴合需求)
直接编写自定义装饰器,跳过登录跳转逻辑,直接校验用户状态和权限,不满足则跳转抱歉页:
from django.shortcuts import redirect def admin_approve_required(view_func): def wrapper(request, *args, **kwargs): # 校验用户是否已登录且具备管理员权限 if request.user.is_authenticated and is_mbcadmin(request.user): return view_func(request, *args, **kwargs) # 不满足条件直接跳抱歉页,替换为你的抱歉页URL return redirect('/sorry/') return wrapper
在你的审批视图上使用这个装饰器:
@admin_approve_required def approve_list(request, token_segment1, token_segment2): # 这里编写展示待审批用户列表的逻辑 # 比如根据令牌查询对应的审批数据 ...
方法二:调整登录后跳转逻辑(适合需要先登录再校验的场景)
如果你希望未登录用户先跳登录页,登录后再校验权限并跳转:
- 自定义登录视图,处理登录后的跳转逻辑:
from django.contrib.auth.views import LoginView from django.shortcuts import redirect class AdminLoginView(LoginView): def get_success_url(self): # 获取原本的请求链接(即审批链接) next_url = self.request.GET.get('next') # 登录后校验权限 if is_mbcadmin(self.request.user): # 有权限则跳回原本的审批链接,无则跳默认页 return next_url or super().get_success_url() # 无权限直接跳抱歉页 return '/sorry/'
- 修改urls.py中的登录路由,使用自定义视图:
path('login/', AdminLoginView.as_view(), name='login'),
- 保留原装饰器,确保传递
next参数(默认已开启):
from django.contrib.auth.decorators import user_passes_test @user_passes_test(is_mbcadmin, login_url="/login/") def approve_list(request, token_segment1, token_segment2): ...
说明
- 方法一直接跳过登录流程,不符合条件就跳转抱歉页,完全匹配你的需求;
- 方法二更适合需要引导未登录管理员先登录再处理审批的场景;
- 记得将代码中的
/sorry/替换为你实际的抱歉页URL。
内容的提问来源于stack exchange,提问作者PTB
相关产品推荐
相关产品推荐

