一. Django数据库使用顺序
如果在settings的DATABASES中为某一app配置的数据库,则该app使用这个数据库,如果app没有配置专门的数据库,则使用default中配置的数据库
二. 在orm中,为关联表的主表查询字表时起别名:related_name
三. 主表与子表的级联删除
1.主表与字表
- 级联删除
删除主表中某条记录,子表中的关联内容也会删除,删除子表中木条记录,主表中的关联内容不会被删除
四.db_constraint属性
该属性可以实现不建立约束关系,但能应用建立约束所使用的查询接口
用于某些项目中的数据实际上具有一对多或多对多或一对一的关系,但是并不能够建立约束,此时如果不适用该属性,无法应用orm提供的查询接口,操作起来非常麻烦.
五.创建二级菜单
实现效果:
信息管理
客户列表
财务管理
缴费列表
- 表结构更改(背景灰色为新增部分):
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
- 注入二级菜单所有信息
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 });