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传参不需要"|"来进行传参
Django的Rbac介绍3的更多相关文章
- Django的Rbac介绍2
上一篇博客我们记录了一下Django中使用Rbac,但是上一篇博客中的方法有一点不好,就是,因为我要在html文件中控制:如果用户有某个权限,则显示这个权限所代表的按钮,但是我现在只有1张表的增删改查 ...
- Django的Rbac介绍1
1.django的权限管理叫做RBAC 我们在百度上查看RBAC的概念如下 基于角色的权限访问控制(Role-Based Access Control)作为传统访问控制(自主访问,强制访问)的有前景的 ...
- Django - Django框架 简单介绍
Django框架 简单介绍 本文地址: http://blog.csdn.net/caroline_wendy/article/details/29172271 1. 介绍 Django是一个开放源码 ...
- Django项目结构介绍
官网下载网址:https://www.djangoproject.com/download/ 安装(安装最新LTS版): pip3 install django==2.0.7 创建一个django项目 ...
- Django中ORM介绍和字段及字段参数 Object Relational Mapping(ORM)
Django中ORM介绍和字段及字段参数 Object Relational Mapping(ORM) ORM介绍 ORM概念 对象关系映射(Object Relational Mapping,简 ...
- RBAC 介绍 (权限)
RBAC是什么? RBAC是基于角色的访问控制(Role-Based Access Control )在RBAC中,权限与角色相关联,用户通过成为适当角色的成员而得到这些角色的权限.这就极大地简化了权 ...
- Openresty最佳案例 | 第8篇:RBAC介绍、sql和redis模块工具类
转载请标明出处: http://blog.csdn.net/forezp/article/details/78616738 本文出自方志朋的博客 RBAC介绍 RBAC(Role-Based Acce ...
- 6月20日 Django中ORM介绍和字段、字段参数、相关操作
一.Django中ORM介绍和字段及字段参数 二.Django ORM 常用字段和参数 三.Django ORM执行原生SQL.在Python脚本中调用Django环境.Django终端打印SQL语句 ...
- rbac介绍、自动生成接口文档、jwt介绍与快速签发认证、jwt定制返回格式
今日内容概要 RBAC 自动生成接口文档 jwt介绍与快速使用 jwt定制返回格式 jwt源码分析 内容详细 1.RBAC(重要) # RBAC 是基于角色的访问控制(Role-Based Acces ...
随机推荐
- C#反射机制详解
反射的定义:审查元数据并收集关於它的类型信息的能力,元数据(编辑后的基本数据单元)就是一大堆表,编译器会创建一个类定义表,一个字段定义表,一个方法定义表等,System.Reflection命名空间包 ...
- 新装kafka与zookeeper配置
zookeeper配置 dataDir=/opt/kafka_2.11-2.0.0/data/zookeeper # 尽量不要放在tmp# the port at which the clients ...
- get return value of python in shell
from: https://stackoverflow.com/questions/2115615/assigning-value-to-shell-variable-using-a-function ...
- BerOS File Suggestion(stl-map应用)
Polycarp is working on a new operating system called BerOS. He asks you to help with implementation ...
- cin.tie与sync_with_stdio加速输入输出
在LeetCode上练习习题的时候每次AC之后都会去看别人的代码,几乎每次都能遇到cin.tie与sync_with_stdio.类似这样: static auto x = [](){ std::io ...
- C++几个重要关键字(包含借鉴其他博主的东西)
//内存 栈区 与 static区 ,C++为了兼容C,#include 只是文本替换,导致一堆命名空间之间的复杂问题,倍受人诟病 extern 关键字 1.基本含义:意如其名,告诉编译器声明的东西 ...
- (转)如何禁用Windows 10系统的触摸屏
https://baijiahao.baidu.com/s?id=1593890738706748667 现在许多优质的Windows 10个人电脑都配备了触摸屏,因为触摸屏的日益普及,Windows ...
- Java学习05 (第一遍) - JSP与Servlet
JSP 客户端发出Request请求,JSP容器将JSP转译为Servlet的源码,再编译加载到内存执行,结果Response到客户端. Request->JSP->Servlet(jav ...
- LDA线性判别分析(转)
线性判别分析LDA详解 1 Linear Discriminant Analysis 相较于FLD(Fisher Linear Decriminant),LDA假设:1.样本数据服从正态分布,2 ...
- 深入理解hello world
阅读目录 为什么所有东西都是从类开始的 为什么总是需要有一个“main”方法 HelloWorld的字节码 HelloWorld在JVM中是如何运行的 对于每个Java程序员来说,HelloWorld ...