遗漏知识点
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 %}