上篇隨筆中,我們實現了動態顯示一級選單,現在考慮這樣一種情況,使用者的選單許可權比較多,這個時候全部並列展現在左側選單就不合適了,所以,現在有這樣乙個需求,即把使用者的選單許可權分類,劃分成二級選單,動態顯示在左側選單,解決方案如下:
(1)分析需求,要求左側選單如下顯示:
客戶管理:
客戶列表
賬單管理:
賬單列表
(2)修改rbac下的models.py,修改後**如下:
from django.db importmodels
class
user(models.model):
"""使用者表
"""name = models.charfield(verbose_name='
使用者名稱', max_length=32)
password = models.charfield(verbose_name='
密碼', max_length=32)
roles = models.manytomanyfield(verbose_name='
擁有的所有角色
', to='
role')
def__str__
(self):
return
self.name
class
role(models.model):
"""角色表
"""title = models.charfield(verbose_name='
角色名稱
', max_length=32)
permissions = models.manytomanyfield(verbose_name='
擁有的所有許可權
', to='
permission')
def__str__
(self):
return
self.title
class permission(models.model): #
建立與選單類的關聯,去掉is_menu和icon
"""許可權表
"""url = models.charfield(verbose_name='
含正則的url
', max_length=32)
title = models.charfield(verbose_name='
標題', max_length=32)
menu = models.foreignkey(verbose_name='
所屬選單
', to="
menu
", on_delete=models.cascade, null=true)
def__str__
(self):
return
self.title
class menu(models.model): #
新增乙個選單表
title = models.charfield(max_length=32, verbose_name='選單'
) icon = models.charfield(max_length=32, verbose_name='
圖示', null=true, blank=true)
definitial_session(user_obj, request):
"""將當前登入人的所有許可權url列表和自己構建的所有選單許可權字典注入session
:param user_obj: 當前登入使用者物件
:param request: 請求物件httprequest
"""#
查詢當前登入人的所有許可權列表
ret = role.objects.filter(user=user_obj).values('
permissions__url',
'permissions__title',
'permissions__menu__title',
'permissions__menu__icon',
'permissions__menu__id
').distinct()
permission_list =
permission_menu_dict ={}
for item in
ret:
#獲取使用者許可權列表用於中介軟體中許可權校驗
permissions__url'])
menu_pk = item['
permissions__menu__id']
ifmenu_pk:
if menu_pk not
inpermission_menu_dict:
permission_menu_dict[menu_pk] =],}
else
: permission_menu_dict[menu_pk][
"children
"
"title
": item["
permissions__title"],
"url
": item["
permissions__url"],
})print('
許可權列表
', permission_list)
print('
選單許可權
', permission_menu_dict)
#將當前登入人的許可權列表注入session中
request.session['
permission_list
'] =permission_list
#將當前登入人的選單許可權字典注入session中
request.session['
permission_menu_dict
'] = permission_menu_dict
from django.template importlibrary
register =library()
@register.inclusion_tag(
"menu.html")
defget_menu_styles(request):
permission_menu_dict = request.session.get("
permission_menu_dict")
return
class="multi-menu
">
class="
item
">
class="
title
">
class="
}">
}
class="
body
">
"}">}
到此,二級選單已經渲染到頁面中了,樣式或者其他js效果就靠你的前端技術了!
databases =,'':}
2、foreignkey的引數db_constraint解釋
在學習資料庫時,我們通過定義外來鍵使兩個表建立連線和約束,但有時我們需要只建立連線,不建立約束,也就是通過在表中建立另乙個表的id,不設定foreignkey約束。
django的foreignkey也為我們想好了這兩種情況:
(1)db_constraint = true 表示兩個表之間既建立了連線又有約束,並支援orm語法查詢;
(2)db_constraint = false 表示兩個表之間只建立了連線,沒有建立約束,並支援orm語法查詢;
注意:當然你可能會想到能否將foreignkey改為乙個integerfield,通過定義integerfield欄位的值來與另乙個表建立聯絡,這種方法也沒錯,但是這樣就不能使用orm語法查詢,也就享受不到orm查詢的方便,為開發造成了困難,所以不推薦這樣做!
django許可權之二級選單
遺漏知識點 1.構建表結構時,誰被關聯誰就是主表,在層級刪除的時候,刪除子表的時候,主表不會被刪除,反之刪除主表的話,字表也會被刪除,使用related name none 反向查詢,起名用的 之前使用表名小寫 set.all 使用related name none 就直接使用別名.all 不再使用...
Django框架學習4 二級路由
1.建立了乙個應用後,可以在專案目錄下的urls.py中填寫路由路徑,也可以在應用目錄下新建urls.py填寫路由路徑,然後使用include,將應用目錄下的urls引用到專案目錄下。新建vote應用,在vote目錄下新建urls.py vote目錄下urls.py from django.urls...
css 實現動態二級選單
動態實現簡單的二級選單 當滑鼠放到一級標籤上時,滑鼠會變成小手的形狀 展示二級選單,原始碼如下,複製即可直接使用 1 doctype html 2 html lang en 3 head 4 meta charset utf 8 5 meta name viewport content width ...