- 权限有很多,一个模型就有最少三个权限,如果一些用户拥有相同的权限,那么每次都要重复添加。
这时候分组就可以帮解决这种问题了,可以把一些权限归类,然后添加到某个分组中,之后再把需要赋予这些权限的用户添加到这个分组中,就比较好管理了。 - 分组使用的是
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, Groupdef 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>
