二级菜单

本文详细介绍了如何在Django框架中实现基于角色的权限管理和动态菜单展示,包括修改模型结构、通过Session存储权限信息、获取并渲染二级菜单等关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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>

 

转载于:https://www.cnblogs.com/qq849784670/p/9966276.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值