分组
-
权限有很多,一个模型就有最少三个权限,如果一些用户拥有相同的权限,那么每次都要重复添加。
这时候分组就可以帮解决这种问题了,可以把一些权限归类,然后添加到某个分组中,之后再把需要赋予这些权限的用户添加到这个分组中,就比较好管理了。 -
分组使用的是
django.contrib.auth.models.Group
模型, 每个用户组拥有id
和name
两个字段 -
该模型在数据库被映射为
auth_group
数据表。
分组操作
Group.object.create(group_name)
:创建分组。group.permissions
:某个分组上的权限。多对多的关系。group.permissions.add
:添加权限。group.permissions.remove
:移除权限。group.permissions.clear
:清除所有权限。user.get_group_permissions()
:获取用户所属组的权限。
user.groups
:某个用户上的所有分组。多对多的关系。来自PermissionsMixin
- 使用(下面的
InheritTwo
是自定义的仿User
模型)
from django.contrib.auth.models import ContentType, Permission, Group
def add_group(request):
group = Group.objects.create(name="管理Demo")
# 找到所有关于DemoModel的权限
content_type = ContentType.objects.get_for_model(DemoModel)
permissions = Permission.objects.filter(content_type=content_type)
group.permissions.set(permissions) # 设置权限
group.save() # 保存
return HttpResponse("创建组成功")
def binding_user_group(request):
group = Group.objects.filter(name="管理Demo").first()
if group:
user = InheritTwo.objects.first()
user.groups.add(group) # 父类PermissionsMixin有groups这个多对多字段
user.save()
else:
print("no group")
return HttpResponse('添加权限')
def search_user_group_permission(request):
user = InheritTwo.objects.first()
permissions = user.get_group_permissions() # 获取用户所属组的权限
for permission in permissions:
print(permission)
"""
判断user.permissions下有没有这个权限
有, 返回True
没有 判断所属组下有没有这个权限
"""
if user.has_perm('front.search_demo'):
print("查找demo的权限")
else:
print("没有查找demo的权限")
return HttpResponse("查询用户组权限")
在模板中使用权限
在settings.TEMPLATES.OPTIONS.context_processors
下,因为添加了django.contrib.auth.context_processors.auth
上下文处理器,因此在模板中可以直接通过perms
来获取用户的所有权限。
<body>
<h1>首页</h1>
{% if perms.front.search_demo %}
<h3>查找demo</h3>
{% endif %}
</body>