遺漏知識點
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 %}