django中使用content_type表进行存储app与model的关系。在permission表中设立了name(权限的名字,中英文均可)content_type_id(与content_type是外键关系,用于绑定model)codename(在写代码时使用的权限名)那么如何自定义权限呢?
一、自定义权限
实例代码:
def add_permission(request) '''自定义创建新的权限''' # 获取model在content_type对象 content_type = ContentType.objects.get_for_model(Article) permission = Permission.objects.create(codename='black_article', name='拉黑文章', content_type=content_type) return HttpResponse('权限创建成功')
或者,在建立model时就添加上:
from django.contrib.auth.models import ContentType, Permission
class Article(models.Model): title = models.CharField(max_length=64, verbose_name="标题") content = models.TextField(verbose_name="内容") class Meta: db_table = 'Article' permissions = [ ('black_article', '拉黑文章') ]
二、用户与权限绑定
权限本身只是一个数据,必须和用户进行绑定,才能起到作用。User模型和权限之间的管理,可以通过以下几种方式来管理:
1、mysuer.user_permissions.set(permission_list): 直接给定一个权限的列表。
2、mysuer.user_permissions.add(permission, permission,...): 一个个添加权限。
3、mysuer.user_permissions.remove(permission, permission,...): 一个个删除权限。
4、myuser.user_permissions.clear(): 清除权限。
5、myuser.get_all_permissions(): 获取所有的权限。
6、myser.has_perm('<app_name>.<codename>'): 判断是否拥有某个权限。权限参数时一个字符串,格式是:app_name.codename
实例代码:
def user_add_permission(request): '''用户权限实例''' # 获取当前登录的用户对象 user = request.user # 获取app01的所有权限 content_type = ContentType.objects.get_for_model(app01) permissions = Permission.objects.filter(content_type=content_type) # 为当前用户添加app01的所有权限 # 方式一 user.user_permissions.set(permissions) # 方式二 user.user_permissions.add(permissions[1], permissions[2]) user.save() # 或者使用这个原理:*[1,2,3] = 1,2,3进行添加 user.user_permissions.add(*permissions) user.save() # 查看当前用户的所有权限 print(user.get_all_permissions()) # 删除当前用户所有权限 user.user_permissions.clear() return HttpResponse('査看权限')
三、分组操作
1、Group.object.create(group_name):创建分组
2、group.permissions : 某个分组上的权限。多对多的关系。
1> group.permissions.add : 添加权限
2> group.permissions.remove : 移除权限
3> group.permissions.clear : 清除所有权限
4> user.get_group_premissions() : 获取用户所属组的权限。
3、user.groups : 某个用户上的所有分组。多对多的关系。
示例代码如下:
def operate_group(request): group = Group.object.create(name='编辑') # 创建编辑这个分组 content_type = ContentType.object.get_for_model(Article) # permissions = Permission.object.filter(content_type=content_type) # 获取Article表创建的所有权限 # 添加权限 group.permissions.set(permissions) # 方式一:直接将所有权限添加 group.permissions.add(*permissions) # 方式二:将所有权限添加 group.permissions.add([permissions[0],permissions[1]) # 添加指定的权限 group.save() # 将用户添加到分组 group = Group.object.filter(name='编辑').first() user = User.object.first() user.group.add(group) user.save() return HttpResponse('成功')
四、在模版中使用权限管理:
在settings.TEMPLATES.OPTIONS.context_processors下,因为添加了django.contrib.auth.context_processors.auth上下文处理器,因此在模版中可以直接通过perms来获取用户的所有权限。示例代码如下:
{% if perms.APP名.权限名 %} //拥有该权限名才会看到下面的链接 <a href = '/article/'>文章</a>
{% endif %}