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 %}
  • 相关阅读:
    【jquery仿dataList】应用之——模仿igoogle【定制化、拖动排序,最大化、分屏】
    【jquery版.net控件—dropdownlist】附源码,欢迎大家指点、指正、拍砖!!!
    求【javascript设计模式】【高性能网站建设指南】PDF!哪位有给下啊!!!
    只言碎语总结,今后发展web前端,并分享两个项目难点解决方案。
    【jquery模仿net控件】简单的datalist控件更新,及其简单应用
    一次上机面试题带来的感悟【学习的感觉、学习的方法】
    【jquery模仿net控件】初步GridView模型实现,及其简单应用
    【HTML5初探之Web Workers】网页也能多线程
    Fiddler真乃前端大杀器!!!
    【初探HTML5之使用新标签布局】用html5布局我的博客页!
  • 原文地址:https://www.cnblogs.com/wqzn/p/9966115.html
Copyright © 2011-2022 走看看