双层菜单

一. Django数据库使用顺序

 

如果在settingsDATABASES中为某一app配置的数据库,则该app使用这个数据库,如果app没有配置专门的数据库,则使用default中配置的数据库

二. orm,为关联表的主表查询字表时起别名:related_name

 

三. 主表与子表的级联删除

1.主表与字表

 

  1. 级联删除

 

删除主表中某条记录,子表中的关联内容也会删除,删除子表中木条记录,主表中的关联内容不会被删除

.db_constraint属性

该属性可以实现不建立约束关系,但能应用建立约束所使用的查询接口

用于某些项目中的数据实际上具有一对多或多对多或一对一的关系,但是并不能够建立约束,此时如果不适用该属性,无法应用orm提供的查询接口,操作起来非常麻烦.

.创建二级菜单

  实现效果:

    信息管理

      客户列表

    财务管理

      缴费列表

  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     title = models.CharField(max_length=32, verbose_name='标题')
 7     url = models.CharField(max_length=32, verbose_name='权限')
 8     menu=models.ForeignKey("Menu",on_delete=models.CASCADE,null=True)
 9  
10     class Meta:
11         verbose_name_plural = '权限表'
12         verbose_name = '权限表'
13     
14     def __str__(self):
15         return self.title
  1. 注入二级菜单所有信息

 

3.注入信息

 1 from rbac.models import Role
 2 def initial_sesson(user,request):
 3     """
 4     功能:将当前登录人的所有权限录入session中
 5     :param user: 当前登录人
 6     """
 7     # 查询当前登录人的所有权限列表
 8     # 查看当前登录人的所有角色
 9     # ret=Role.objects.filter(user=user)
10     permissions = Role.objects.filter(user=user).values("permissions__url",
11                                              "permissions__title",
12                                              "permissions__menu__title",
13                                              "permissions__menu__icon",                                                                                                                                               " permissions__menu__pk").distinct()
14     permission_list = []  
15     permission_menu_dict ={}
16     for item in permissions:
17         # 构建权限列表
18         permission_list.append(item["permissions__url"])
19         # 菜单权限
20         menu_pk=item["permissions__menu__pk"]
21         if menu_pk:
22             if menu_pk not in permission_menu_dict:
23                 permission_menu_dict[menu_pk]={
24                      "menu_title":item["permissions__menu__title"],
25                      "menu_icon":item["permissions__menu__icon"],
26                      "children":[
27                          {
28                              "title":item["permissions__title"],
29                              "url":item["permissions__url"],
30                          }
31                      ],
32 
33                 }
34             else:
35                 permission_menu_dict[menu_pk]["children"].append({
36                     "title": item["permissions__title"],
37                     "url": item["permissions__url"],
38                 })
39     print("permission_menu_dict",permission_menu_dict)
40     # 将当前登录人的权限列表注入session中
41     request.session["permission_list"] = permission_list
42     # 将当前登录人的菜单权限字典注入session中
43     request.session["permission_menu_dict"] = permission_menu_dict

3.1信息格式:(bejson在线转换格式工具)

元数据:

[  {
        'permissions__url': '/customer/list/',
        'permissions__title': '客户列表',
        'permissions__menu__title': '信息管理',
        'permissions__menu__icon': 'fa fa-connectdevelop',
        'permissions__menu__pk': 1
    },  
    
    {
        'permissions__url': '/mycustomer/',
        'permissions__title': '我的私户',
        'permissions__menu__title': '信息管理',
        'permissions__menu__icon': 'fa fa-connectdevelop',
        'permissions__menu__pk': 1
    },  
    
    {
        'permissions__url': '/payment/list/',
        'permissions__title': '缴费列表',
        'permissions__menu__title': '财务管理',
        'permissions__menu__icon': 'fa fa-code-fork',
        'permissions__menu__pk': 2
    }, ]

目标数据:

{
   1:{
        "title":"信息管理",
        "icon":"",
        "children":[
            {
              "title":"客户列表",
              "url":"",
            }
        ]
        
      },
      
   2:{
        "title":"财务管理",
        "icon":"",
        "children":[
            {
              "title":"缴费列表",
              "url":"",
            },
        ]
        
      }, 
  

}

4.注入之后要清浏览器的session

5.获取信息,渲染到页面上

在过滤器中:

1 @register.inclusion_tag("rbac/menu.html")
2 def get_menu_styles(request):
3     permission_menu_dict = request.session.get("permission_menu_dict")
4     print("permission_menu_dict",permission_menu_dict)
5     return {"permission_menu_dict":permission_menu_dict}

menu.HTML

 1 <div class="multi-menu">
 2     {% for item in permission_menu_dict.values %}
 3        <div class="item">
 4         <div class="title"><i class="{{ item.menu_icon }}"></i>{{ item.menu_title }}</div>
 5         <div class="body">
 6               {% for foo in item.children %}
 7                   <a href="{{ foo.url }}">{{ foo.title }}</a>
 8               {% endfor %}
 9         </div>
10        </div>
11     {% endfor %}
12 </div>

前端调用:

1 <div class="menu-body">
2        {% load web %}
3        {% get_menu_styles request %}
4 </div>

获得样式的css:

 1 .multi-menu .item > .body {
 2     border-bottom: 1px solid #dddddd;
 3 }
 4 
 5 .multi-menu .item > .body a {
 6     display: block;
 7     padding: 5px 20px;
 8     text-decoration: none;
 9     border-left: 2px solid transparent;
10     font-size: 13px;
11 
12 }
13 
14 .multi-menu .item > .body a:hover {
15     border-left: 2px solid #2F72AB;
16 }
17 
18 .multi-menu .item > .body a.active {
19     border-left: 2px solid #2F72AB;
20 }

6.二级菜单隐藏效果,获得事件的js

1 $('.item .title').click(function () {
2     $(this).next().toggleClass('hide');
3     $(this).parent().siblings().children(".body").addClass("hide")
4 });

 

原文地址:https://www.cnblogs.com/shanghongyun/p/9977245.html