zoukankan      html  css  js  c++  java
  • Django--CRM--一级, 二级 菜单表

    一. 一级菜单表 

      1. 首先要修改权限表的字段, 在权限表下面加上icon和 is_menu 的字段

      

      2. 展示结果

      

      

    # 我们既然想要动态生成一级菜单,那么就需要从数据库中拿出当前登录的用户的菜单表是哪个,那么我们就要在验证的部分拿出is_menu的字段,看是否为True,
      然后把这些数据存到session中去,这里我们最好把request.session[key]中的可以写到settings中去,这样以后修改也方便些

      

    其他的地方要用到session的时候也直接导入settings就行

      3.  然后我们需要在html文件中进行操作了, 让不同用户显示不同菜单, 这时候我们就需要用到自定义标签inclusion_tag了, 这里我们要注意两点:

        1. 一定要是引入而不是文件夹, 就是带__init__的文件的templatetags

        2. 一定不要在包下的py文件中进行循环, 在模板中进行循环

      

      4. 让选中的标签显示active的状态

    在自定义标签里面获取到request.path, 然后判断菜单的路径是否是获取到的路径(用正则),
        如果是,在字典里面添加属性class='active', 然后在渲染的HTML文档里面取出来

      

      

    二. rbac功能整合

      按照流程整合,整合成一个组件, 就是把其他的项目也能用的东西整合到一起

        1. 把验证部分的代码放到rbac/service/permission.py中, 然后封装成函数,需要使用的地方可以直接调用

        2. 把需要的的css样式保存在rbac项目下的static/css中

    复制代码
     1 def init_permission(request, obj):
     2     # 跨表查询用双下划线  ORM获取到权限信息 过滤掉权限为空的 去重
     3     permission_query = obj.roles.filter(permissions__url__isnull=False).values(
     4         'permissions__url',
     5         'permissions__menu__title',
     6         'permissions__menu__icon',
     7         'permissions__menu_id',
     8     ).distinct()
     9 
    10 
    11     # 菜单字典  # 二级菜单
    12     menu_dict = {}
    13 
    14     # 权限列表
    15     permission_list = []
    16     for i in permission_query:
    17         permission_list.append({'url': i['permissions__url']})
    18 
    19         menu_id = i.get('permissions__menu_id')
    20         if not menu_id:
    21             continue
    22 
    23         menu_dict.setdefault(menu_id, {
    24             'title': i['permissions__menu__title'],
    25             'icon': i['permissions__menu__icon'],
    26             'children': []
    27         })
    28         menu_dict[menu_id]['children'].append({'title': i['permissions__menu__title'], 'url': i['permissions__url']})
    29 
    30     # 这种可配置的东西写在settings中去
    31     from django.conf import settings
    32     request.session[settings.MENU_SESSION_KEY] = menu_dict
    33     request.session[settings.PERMISSION_SESSION_KEY] = permission_list
    34     request.session['is_login'] = True
    复制代码

      

     三 . 二级菜单

      1. 要新建一张表,作为一级菜单表, 然后把权限表外键到这个一级菜单表中去

      

      

      2. 到admin中把新建的这张表注册一下,然后登陆admin,把权限表和一级菜单表的关系处理一下

      

       

      3. 在验证登录成功后, 把需要用的东西放到session中去. 主要需要的是一级菜单的title, icon和二级菜单的title和url(上文中的init_permission函数中有获取方法)

       

      4. 同样要用到自定义标签inclusion_tag

      

    # menu_dict的数据是下面这样的:
    {1: {'title': '客户管理', 'icon': 'fa-user', 'children': [{'title': '客户展示', 'url': '/customer/list/'}]}
    # 拿value之后变成了:
    {'title': '客户管理', 'icon': 'fa-user', 'children': [{'title': '客户展示', 'url': '/customer/list/'}]

      

      

      菜单点击事件

      

      

     

     

      

  • 相关阅读:
    Algs4-1.1.17找出以下递归函数的问题
    Algs4-1.1.16给出exR1(6)的返回值
    Algs4-1.1.15编写一个静态方法histogram()
    Algs4-1.1.14实现以2为底的对数
    Algs4-1.1.13编写一段代码,打印出一个M行N列的二维数组的转置(交换行和列)
    Algs4-1.1.12以下代码段会打印出什么结果?
    python将一个列表的元素随机打乱
    python 类似java的三目运算符
    java的三元运算符
    java 的Colections类(Java也有python类似列表的反转、排序等方法)
  • 原文地址:https://www.cnblogs.com/uiys/p/10673490.html
Copyright © 2011-2022 走看看