当前位置: 首页 > news >正文

Django的Rbac介绍3

今天的博客主要是记录一下如何实现左侧菜单,这里我们想实现的效果就是,如果用户有查看用户的权限,则显示查看用户的左侧菜单,如果用户有查看角色的权限,则显示查看角色的左侧菜单,如果两者都有,则需要显示两个菜单

我们先来看下model中我们如何设计的数据库

from django.db import models

# Create your models here.

class Userinfo(models.Model):
    username = models.CharField(max_length=64)
    uerpwd = models.CharField(max_length=64)
    roles = models.ManyToManyField(to="Role")

    def __str__(self):
        return self.username
    class Meta:
        verbose_name = "用户表"
        verbose_name_plural = verbose_name

class Role(models.Model):
    title = models.CharField(max_length=64)
    pers = models.ManyToManyField(to="per")


    def __str__(self):
        return self.title
    class Meta:
        verbose_name="角色表"
        verbose_name_plural = verbose_name

class per(models.Model):
    title = models.CharField(max_length=64)
    url = models.CharField(max_length=128)
    action = models.CharField(max_length=32, default="")
    group = models.ForeignKey("PerGroup", default=1)
    def __str__(self):
        return self.title
    class Meta:
        verbose_name = "权限表"
        verbose_name_plural = verbose_name


class PerGroup(models.Model):
    title = models.CharField(max_length=32)

    def __str__(self): return self.title

    class Meta:
        verbose_name = "权限组"
        verbose_name_plural = verbose_name

  

 

在视图函数中,我们可以在session中拿到per_dict这个数据,下面的数据就是某个用户的per_dict的值

这个数据的内容如下

{'1':

'urls': ['/user/', '/user/add/', '/user/edit/(\\d+)', '/user/del/(\\d+)'],
'action': ['list', 'add', 'edit', 'del']},
'2':
{
'urls': ['/role/add/', '/role/', '/role/del/(\\d+)','/role/edit/(\\d+)'],
'action': ['add', 'list', 'del', 'edit']}}

 

我们需要拿到action为list的权限,并拿到这个这个权限的titile和url,代码如下

 

先获取per_group的列表

  group_list = []
    for k,v in request.session["per_dict"].items():
        if "list" in v["action"]:
            group_list.append(k)

  

通过per_group的列表,获取title和url,然后渲染到前端就可以了

    menu_tile = []
    print(group_list,"ddddddddddddddddddddddd")
    from django.db.models import Q
    for i in group_list:
        name = rbacmodels.PerGroup.objects.get(id=int(i)).title

        url = rbacmodels.PerGroup.objects.get(id=int(i)).per_set.filter(Q(action__exact="list")).first().url
        temp = [name,url]
        menu_tile.append(temp)

  

return render(request,"rbac_roles.html",{"action":action,"role_list":role_list,"menu_tile":menu_tile})

  

最后在html文件中渲染就可以了

<div class="menu">
    {% for menu in menu_tile %}
    <p class="ment_btn"><a href="{{ menu.1 }}">{{ menu.0 }}</a></p>
    {% endfor %}
</div>

  

 

 

上面的html这里的代码处理,我们是不是还有更加方便的实现手段,当然有,因为这里其实就是一个html的片段,我们可以用使用inclusion_tags来实现

下面我们就用inclusion_tags来实现

 

 这个函数的意思就是,将函数的返回值,渲染到inclusion_tags中指定的html文件中

 

我们在看下渲染的html文件

<div class="menu">
    {% for menu in menu_tile %}
    <p class="ment_btn"><a href="{{ menu.1 }}">{{ menu.0 }}</a></p>
    {% endfor %}
</div>

  

最后我们看下调用这个函数的html文件

{% load rbac_tags %}

{% create_rbac_menu  menu_tile %}

  

这里要非常注意,使用inclusion_tags传参不需要"|"来进行传参

 

转载于:https://www.cnblogs.com/bainianminguo/p/10023894.html

相关文章:

  • 毫秒级从百亿大表任意维度筛选数据,是怎么做到的...
  • 网上流传的那些关于链表的面试问题
  • JavaScript的使用你知道几种?(上)
  • 根据开始日期和当前日期,获取当前是第几周
  • 服务发现全量配置整理(更新中)
  • MySql版本查看
  • 业务员类别窗体的制作
  • lucene 思维导图,让搜索引擎不再难懂
  • “如何让团队成员获得成长?”四名高段位 CTO 为你解惑
  • 二叉树应用
  • Yii2 RULE 校验器
  • 使用xorm工具,根据数据库自动生成 go 代码
  • 服务端渲染(SSR)
  • 2019互联网校招薪资表: BAT、华为还没有TMD高
  • 使用java执行ffmpeg命令进行推流操作
  • 30天自制操作系统-2
  • C学习-枚举(九)
  •  D - 粉碎叛乱F - 其他起义
  • node 版本过低
  • PhantomJS 安装
  • supervisor 永不挂掉的进程 安装以及使用
  • webpack项目中使用grunt监听文件变动自动打包编译
  • 坑!为什么View.startAnimation不起作用?
  • 使用 Docker 部署 Spring Boot项目
  • 微信小程序实战练习(仿五洲到家微信版)
  • 项目管理碎碎念系列之一:干系人管理
  • 小程序 setData 学问多
  • 《天龙八部3D》Unity技术方案揭秘
  • MPAndroidChart 教程:Y轴 YAxis
  • ​ 全球云科技基础设施:亚马逊云科技的海外服务器网络如何演进
  • #### go map 底层结构 ####
  • #mysql 8.0 踩坑日记
  • (android 地图实战开发)3 在地图上显示当前位置和自定义银行位置
  • (ZT)北大教授朱青生给学生的一封信:大学,更是一个科学的保证
  • (非本人原创)史记·柴静列传(r4笔记第65天)
  • (非本人原创)我们工作到底是为了什么?​——HP大中华区总裁孙振耀退休感言(r4笔记第60天)...
  • (附源码)ssm本科教学合格评估管理系统 毕业设计 180916
  • (论文阅读11/100)Fast R-CNN
  • (免费分享)基于springboot,vue疗养中心管理系统
  • (入门自用)--C++--抽象类--多态原理--虚表--1020
  • (三十五)大数据实战——Superset可视化平台搭建
  • (三维重建学习)已有位姿放入colmap和3D Gaussian Splatting训练
  • (一一四)第九章编程练习
  • .desktop 桌面快捷_Linux桌面环境那么多,这几款优秀的任你选
  • .NET Windows:删除文件夹后立即判断,有可能依然存在
  • .NET 将混合了多个不同平台(Windows Mac Linux)的文件 目录的路径格式化成同一个平台下的路径
  • .NET 使用配置文件
  • .NET 线程 Thread 进程 Process、线程池 pool、Invoke、begininvoke、异步回调
  • .NET 中 GetProcess 相关方法的性能
  • .NET/C# 使用反射注册事件
  • .NET/C# 异常处理:写一个空的 try 块代码,而把重要代码写到 finally 中(Constrained Execution Regions)
  • .NET/C# 中你可以在代码中写多个 Main 函数,然后按需要随时切换
  • .Net多线程总结
  • .NET中的Exception处理(C#)
  • @autowired注解作用_Spring Boot进阶教程——注解大全(建议收藏!)