Django权限不足时如何重定向到指定视图/页面?
Django 联系人视图权限重定向解决方案
原有实现的问题
@user_passes_test装饰器默认逻辑是校验不通过时跳转到登录页,而非你需要的业务页面重定向,且你未正确配置带命名空间的路由,所以始终报错。- 自定义校验逻辑中
str(self.user.groups.filter) == 'Contacts = True'写法错误,该语句打印的是QuerySet方法对象,永远不可能和组名字符串匹配。 - 统一入口方案中调用
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
相关产品推荐
相关产品推荐

