Django--CRM--菜单排序等

一 . 菜单排序

  1.我们想把菜单排序.首先给菜单加上权重,权重大的排在上面, 这就要在菜单表上加上一个权重字段.

  

  2. 我们在菜单表里面把权重改一下

  

  3. 需要把权重字段的信息拿出来放到session中去

  4. 在自定义过滤器里面进行排序  然后其他的不用改就会显示成排序后的菜单

复制代码
from django import template
from django.conf import settings
from collections import OrderedDict

register = template.Library()

@register.inclusion_tag('menu.html')
def my_menu(request):
    url = request.path
    # 二级菜单
    menu_dict = request.session[settings.MENU_SESSION_KEY]  # 不能在这循环,需要模板里面循环
    # 按照添加的顺序进行展示 有序字典
    ordered_dict = OrderedDict()
    # ret是按照权重排完序的key
    ret = sorted(menu_dict, key=lambda x: menu_dict[x]['weight'], reverse=True)
    for i in ret:
        ordered_dict[i] = menu_dict[i]
    return {'menu_list': ordered_dict.values()}
复制代码

 

二 . 二级菜单选中并且展开

  

# 实现思路
1. 当我们点击二级菜单的时候, 让他显示被选中的状态,需要class="active"
2. 进入菜单页面的时候,除了输入的二级菜单对应的一级菜单外,其他的一级菜单都应该收起来
3. 当我们点击另一个一级菜单的时候, 其他的一级菜单全部都收起来

 

  

  

 

   

  来看一下效果

     

 

三. 非菜单权限的归属

  上面的操作有点瑕疵:

   

  造成上面的原因是添加和编辑等和二级菜单没啥关系,影响不了二级菜单的展开与隐藏, 解决这个问题,需要把他们添加一对多的关系

  

 

  看一下权限表

  

  

1 . 由上图可知, 如果点击的是编辑增加等标签,他的parent_id就是二级菜单的id, 这样我们就可以通过点击添加或者编辑找到二级标签的id,
    那么我们就可以在自定义过滤器中判断,如果拿到的是二级id,那么就让这个菜单添加被选中并且展开的状态
2 . 我们需要把parent_id 和 二级菜单的id放到session中去

  

  然后我们需要在权限验证的中间件中拿到二级菜单的id

 

 权限验证中获取二级菜单的id

 

 

 

 

  当然,可以以配置到settings中去, 操作方法在上面写了,注释的那个就是

  

 

 四 . 路径导航

  

  

 

 权限验证中间件中的路径导航

  

  

 

 五 . 权限粒度控制按钮级别

    权限粒度控制按钮级别意思就是你有这个权限给你展示这个按钮,你没有这个权限就不给你展示

    思路:

      1. 把用户的所有权限放到一个列表里面

      2. 如果前端展示的按钮在用户的权限列表了,那么就显示

      3. 由于url的别名不会总该,所以这里我们用别名来表示权限的url

      4. 用url的别名, 要把别名写到数据库

      5. 在权限表里面加一个别名字段,并且这个name要是唯一的, 要注意的是, 这个字段是后添加的, 需要先设置default, 但是不能直接填unique=True

      6. 迁移完之后,把别名一一对应手动填写到权限表的name字段

        

      7. 再到name字段中添加unique=True, 然后在进行数据库迁移

      

      8. 我们需要获得数据库中的name字段的数据,这样我们可以把permission_dict[i['permissions__id']] 改为 permission_dict[i['permissions__name']] 因为都是唯一的

          由于key 从id 改为 name了,所以我们的路径导航里面的用到的permissions__id也要做出相应的改变,之前用的是二级菜单的id, 由于存在关系,所以可以通过pid找到

            二级菜单的name,然后中间件中的引用的str(pid)也要改成name

  

 

 改成name后的权限验证中间件

       9 . 自定义过滤器

  

  

  

posted @ 2019-04-08 21:20  截击机1  阅读(380)  评论(0编辑  收藏  举报