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 %}

 

posted @ 2018-11-15 21:18  魏三斗  阅读(817)  评论(0编辑  收藏  举报