django許可權之二級選單

Bound_w發表於2018-11-15

遺漏知識點

1.構建表結構時,誰被關聯誰就是主表,在層級刪除的時候,刪除子表的時候,主表不會被刪除,反之刪除主表的話,字表也會被刪除,

使用related_name=None   反向查詢,起名用的

之前使用表名小寫+__set.all()  使用related_name=None 就直接使用別名.all()不再使用表名小寫+__set方法了

 

2.如果專案使用多個資料庫的話,要在seeing中的DATABASE中新增資料庫,在default下使用app的名字配置資料庫

django許可權之二級選單

操作步驟:

1.更改表結構

class Menu(models.Model):
   title = models.CharField(max_length=32, verbose_name='選單')
   icon = models.CharField(max_length=32, verbose_name='圖示', null=True, blank=True)


class Permission(models.Model):
   """
   許可權表
   """
   title = models.CharField(max_length=32, verbose_name='標題')
   url = models.CharField(max_length=32, verbose_name='許可權')
   menu=models.ForeignKey("Menu",on_delete=models.CASCADE,null=True)   ###注意:設定null為true是為了辨別那個路徑是選單許可權!

 

2.把當前登入的使用者二級選單許可權資訊注入到session中

  1.查詢當前登入人的所有許可權

permissions = Role.objects.filter(user=user).values("permissions__url",
                                                        "permissions__title",#拿到使用者的許可權名
                                                        "permissions__menu__title",#拿到二級選單的選單名
                                                        "permissions__menu__icon",#拿到二級選單的圖示
                                                        "permissions__menu__pk").distinct()#拿到二級選單的pk

permission_list = []#所有許可權列表
#二級選單以及選單許可權的結構思路:
  以pk值為鍵,以選單的title和icon為值
  選單許可權列表套字典
permission_menu_dict ={}
for item in permissions:
# 構建許可權列表,拿到許可權
permission_list.append(item["permissions__url"])

# 選單許可權
menu_pk=item["permissions__menu__pk"]
if menu_pk:

      #如果構建的許可權字典中沒有pk鍵,進行新增值
if menu_pk not in permission_menu_dict:

permission_menu_dict[menu_pk]={
"menu_title":item["permissions__menu__title"],
"menu_icon":item["permissions__menu__icon"],
           #選單許可權
"children":[
{
"title":item["permissions__title"],
"url":item["permissions__url"],
}
],

}
    #如果有pk的話,就證明之前新增過一個許可權選單,再次新增的時候會覆蓋掉之前的選單許可權
else:
      #使用append方法就能解決覆蓋的現象
permission_menu_dict[menu_pk]["children"].append({
"title": item["permissions__title"],
"url": item["permissions__url"],
})
    
# 將當前登入人的許可權列表注入session中
request.session["permission_list"] = permission_list
# 將當前登入人的選單許可權字典注入session中
request.session["permission_menu_dict"] = permission_menu_dict

 

3.獲取二級選單的資訊menu.html

<div class="multi-menu">

    {% for item in permission_menu_dict.values %}#迴圈構造的選單許可權字典,拿到字典的值

       <div class="item">
#把圖示,文字,進行渲染 <div class="title"><i class="{{ item.menu_icon }}"></i>{{ item.menu_title }}</div> <div class="body">
#迴圈取值
{% for foo in item.children %} <a href="{{ foo.url }}">{{ foo.title }}</a> {% endfor %} </div> </div> {% endfor %} </div>


#拿到選單許可權的資料web.py
from django.utils.safestring import mark_safe
from django.template import Library
import re
register =Library()
@register.inclusion_tag("rbac/menu.html")
def get_menu_styles(request):
permission_menu_dict = request.session.get("permission_menu_dict")
print("permission_menu_dict",permission_menu_dict)
return {"permission_menu_dict":permission_menu_dict}

 

4.渲染頁面

#前端渲染頁面,被繼承的頁面layout.html
{% load web %}
{% get_menu_styles request %}

 

相關文章