1.修改表结构
1 class Menu(models.Model): 2 title = models.CharField(max_length=32, verbose_name='菜单') 3 icon = models.CharField(max_length=32, verbose_name='图标', null=True, blank=True) 4 5 class Permission(models.Model): 6 """ 7 权限表 8 """ 9 title = models.CharField(max_length=32, verbose_name='标题') 10 url = models.CharField(max_length=32, verbose_name='权限') 11 menu=models.ForeignKey("Menu",on_delete=models.CASCADE,null=True)
2.重新将二级菜单信息主人session中
from rbac.models import Role def initial_sesson(user,request): """ 功能:将当前登录人的所有权限录入session中 :param user: 当前登录人 """ # 查询当前登录人的所有权限列表 # 查看当前登录人的所有角色 # ret=Role.objects.filter(user=user) permissions = Role.objects.filter(user=user).values("permissions__url", "permissions__title", "permissions__menu__pk", "permissions__menu__title", "permissions__menu__icon" ).distinct() print(permissions) permission_list = [] permission_menu_dict = {} for item in permissions: # 构建权限列表 permission_list.append(item["permissions__url"]) # 构建菜单权限列表 if item["permissions__menu__pk"]: if not item["permissions__menu__pk"] in permission_menu_dict: permission_menu_dict = { "title":item["permissions__menu__title"], "icon":item["permissions__menu__icon"], "children":[ { "title":item["permissions__title"], "url":item["permissions__url"] } ] } else: permission_menu_dict["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.获取二级菜单信息
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) return {"permission_menu_dict":permission_menu_dict}
4.渲染界面
<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>