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

Django权限不足时如何重定向到指定视图/页面?

Django 联系人视图权限重定向解决方案

原有实现的问题

  1. @user_passes_test装饰器默认逻辑是校验不通过时跳转到登录页,而非你需要的业务页面重定向,且你未正确配置带命名空间的路由,所以始终报错。
  2. 自定义校验逻辑中str(self.user.groups.filter) == 'Contacts = True'写法错误,该语句打印的是QuerySet方法对象,永远不可能和组名字符串匹配。
  3. 统一入口方案中调用contacts_check()时未传入request.user参数,函数无法完成校验,且入口未加登录装饰器,匿名用户可直接访问。

正确实现方案

推荐使用统一入口方案,逻辑集中更易维护:

1. 视图层代码(views.py)

from django.contrib.auth.decorators import login_required

# 注意组名需与后台实际创建的用户组名称完全匹配,避免空格误差
def contacts_check(user):
    return user.groups.filter(name="Contacts = True").exists()

# 统一入口加登录校验
@login_required
def contacts_view(request):
    if contacts_check(request.user):
        return search_contacts(request)
    return search_contacts_small(request)

# 两个业务视图无需单独配置路由,避免用户直接访问
def search_contacts(request):
    # 原有完整联系人视图逻辑
    ...

def search_contacts_small(request):
    # 原有精简联系人视图逻辑
    ...

2. 路由配置(urls.py)

只需保留一个公共入口即可:

app_name = "app"
urlpatterns = [
    path("contacts", contacts_view, name="contacts"),
    # 若仍需保留精简页独立访问入口可保留该行
    # path("contacts2", search_contacts_small, name='contacts2')
]

如果你需要保留两个独立路由,希望B组用户访问/contacts时自动跳转到/contacts2,可直接修改原contacts视图:

from django.shortcuts import redirect
from django.contrib.auth.decorators import login_required

def contacts_check(user):
    return user.groups.filter(name="Contacts = True").exists()

@login_required
def contacts(request):
    if not contacts_check(request.user):
        # 带app命名空间的路由写法,确保重定向正确
        return redirect("app:contacts2")
    # 原有完整联系人视图逻辑
    ...

@login_required
def contacts_small(request):
    # 原有精简联系人视图逻辑
    ...

注意事项

  • 用户组名称需完全匹配,创建组时的空格、大小写都会影响校验结果
  • 使用redirect调用带app_name的命名路由时,必须加上app:前缀,否则会找不到路由

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 23:15:01