Django 許可權(3) 動態顯示二級選單

2022-05-29 17:33:10 字數 3990 閱讀 3741

上篇隨筆中,我們實現了動態顯示一級選單,現在考慮這樣一種情況,使用者的選單許可權比較多,這個時候全部並列展現在左側選單就不合適了,所以,現在有這樣乙個需求,即把使用者的選單許可權分類,劃分成二級選單,動態顯示在左側選單,解決方案如下:

(1)分析需求,要求左側選單如下顯示:

客戶管理:

客戶列表

賬單管理:

賬單列表

(2)修改rbac下的models.py,修改後**如下:

from django.db import

models

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)

def

initial_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 import

library

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 ...