django中使用content_type表進行存儲app與model的關係。在permission表中設立了name(許可權的名字,中英文均可)content_type_id(與content_type是外鍵關係,用於綁定model)codename(在寫代碼時使用的許可權名)那麼如何自定義許可權呢? ...
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時就添加上:
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.模型名.許可權名 %} //擁有該許可權名才會看到下麵的鏈接 <a href = '/article/'>文章</a>
{% endif %}