如何在Django HTML模板中排除指定默认用户权限?
如何在Django中排除默认权限,只展示项目相关权限
这问题我之前处理过,其实借助Django的Permission和ContentType模型的关联关系,就能轻松过滤掉那些默认的系统权限。下面给你几个实用的实现方案:
方案一:批量排除指定App的所有权限
Django的默认权限(比如groups、sessions、contenttypes相关)都属于特定的系统App,我们可以直接排除这些App对应的所有权限:
首先在views.py中修改权限查询逻辑:
from django.contrib.auth.models import Permission # 定义需要排除的系统App列表,可根据需求调整 exclude_system_apps = ['auth', 'contenttypes', 'sessions', 'admin', 'messages'] # 过滤权限:排除指定App下的所有权限 permissions = Permission.objects.exclude(content_type__app_label__in=exclude_system_apps)
这样就能一次性去掉所有来自auth(包含groups、users权限)、contenttypes、sessions等系统App的权限,只保留你自己项目中自定义模型对应的权限。
方案二:精准排除特定模型的权限
如果你想更精细地控制(比如保留auth下的用户权限,但排除组权限),可以针对特定模型进行排除:
from django.contrib.auth.models import Permission permissions = Permission.objects.exclude( # 先排除纯系统App的权限 content_type__app_label__in=['contenttypes', 'sessions', 'admin', 'messages'] ).exclude( # 单独排除auth下的group模型相关权限 content_type__app_label='auth', content_type__model='group' )
方案三:直接排除特定权限编码
如果你明确知道要排除的权限编码(codename),也可以直接通过codename过滤:
from django.contrib.auth.models import Permission # 列出需要排除的权限编码 exclude_codenames = [ 'add_group', 'change_group', 'delete_group', 'view_group', 'add_contenttype', 'change_contenttype', 'delete_contenttype', 'view_contenttype', 'add_session', 'change_session', 'delete_session', 'view_session' ] permissions = Permission.objects.exclude(codename__in=exclude_codenames)
模板部分无需修改
你的HTML模板循环逻辑保持不变即可:
{% for permission in permissions %} {{ permission.name }} {% endfor %}
补充说明
Django的每个权限都会关联到一个ContentType对象,而ContentType是按**App标签(app_label)和模型名称(model)**来分类的,所以通过过滤content_type字段就能精准筛选出你需要的权限。你可以根据自己项目的实际情况,调整上述方案中的排除规则。
内容的提问来源于stack exchange,提问作者user4003969
相关产品推荐
相关产品推荐

