zoukankan      html  css  js  c++  java
  • django权限之二级菜单

    遗漏知识点

    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 %}
  • 相关阅读:
    JSON学习笔记-5
    JSON学习笔记-4
    JSON学习笔记-3
    JSON学习笔记-2
    JSON学习笔记-1
    stm32f103各个型号芯片之间程序移植(stm32的兼容问题)
    如何找回微信小程序源码?2020年微信小程序反编译最新教程 小宇子李
    git常用命令
    304 怎么办 怎么解决 缓存解决
    微信小程序 CSS border-radius元素 overflow:hidden失效问题 iPhone ios 苹果兼容问题 伪类元素
  • 原文地址:https://www.cnblogs.com/wqzn/p/9966115.html
Copyright © 2011-2022 走看看