django权限之二级菜单

Posted wqzn

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 %}

 

以上是关于django权限之二级菜单的主要内容,如果未能解决你的问题,请参考以下文章

RABC权限控制(二级菜单实现)

QT之二级菜单(二级菜单的箭头可以使用QSS设置图片)

js+数据库生成三级动态tree导航菜单

php微信公众号开发之二级菜单

django-博客园首页-实现二级菜单的跳转

根据权限动态生成二级菜单