• 权限有很多,一个模型就有最少三个权限,如果一些用户拥有相同的权限,那么每次都要重复添加。
    这时候分组就可以帮解决这种问题了,可以把一些权限归类,然后添加到某个分组中,之后再把需要赋予这些权限的用户添加到这个分组中,就比较好管理了。
  • 分组使用的是django.contrib.auth.models.Group模型, 每个用户组拥有idname两个字段
  • 该模型在数据库被映射为auth_group数据表。

分组操作

  1. Group.object.create(group_name):创建分组。
  2. group.permissions:某个分组上的权限。多对多的关系。
    • group.permissions.add:添加权限。
    • group.permissions.remove:移除权限。
    • group.permissions.clear:清除所有权限。
    • user.get_group_permissions():获取用户所属组的权限。
  3. user.groups:某个用户上的所有分组。多对多的关系。来自PermissionsMixin
  • 使用(下面的InheritTwo是自定义的仿User模型)
  1. from django.contrib.auth.models import ContentType, Permission, Group
  2. def add_group(request):
  3. group = Group.objects.create(name="管理Demo")
  4. # 找到所有关于DemoModel的权限
  5. content_type = ContentType.objects.get_for_model(DemoModel)
  6. permissions = Permission.objects.filter(content_type=content_type)
  7. group.permissions.set(permissions) # 设置权限
  8. group.save() # 保存
  9. return HttpResponse("创建组成功")
  1. def binding_user_group(request):
  2. group = Group.objects.filter(name="管理Demo").first()
  3. if group:
  4. user = InheritTwo.objects.first()
  5. user.groups.add(group) # 父类PermissionsMixin有groups这个多对多字段
  6. user.save()
  7. else:
  8. print("no group")
  9. return HttpResponse('添加权限')
  1. def search_user_group_permission(request):
  2. user = InheritTwo.objects.first()
  3. permissions = user.get_group_permissions() # 获取用户所属组的权限
  4. for permission in permissions:
  5. print(permission)
  6. """
  7. 判断user.permissions下有没有这个权限
  8. 有, 返回True
  9. 没有 判断所属组下有没有这个权限
  10. """
  11. if user.has_perm('front.search_demo'):
  12. print("查找demo的权限")
  13. else:
  14. print("没有查找demo的权限")
  15. return HttpResponse("查询用户组权限")

在模板中使用权限

settings.TEMPLATES.OPTIONS.context_processors下,因为添加了django.contrib.auth.context_processors.auth上下文处理器,因此在模板中可以直接通过perms来获取用户的所有权限。

  1. <body>
  2. <h1>首页</h1>
  3. {% if perms.front.search_demo %}
  4. <h3>查找demo</h3>
  5. {% endif %}
  6. </body>