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

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):
    # 这里编写展示待审批用户列表的逻辑
    # 比如根据令牌查询对应的审批数据
    ...

方法二:调整登录后跳转逻辑(适合需要先登录再校验的场景)

如果你希望未登录用户先跳登录页,登录后再校验权限并跳转:

  1. 自定义登录视图,处理登录后的跳转逻辑:
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/'
  1. 修改urls.py中的登录路由,使用自定义视图:
path('login/', AdminLoginView.as_view(), name='login'),
  1. 保留原装饰器,确保传递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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 03:05:21