博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Django的Rbac介绍3
阅读量:6237 次
发布时间:2019-06-22

本文共 2822 字,大约阅读时间需要 9 分钟。

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

我们先来看下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_nameclass 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_nameclass 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_nameclass 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文件中渲染就可以了

  

 

 

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

下面我们就用inclusion_tags来实现

 

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

 

我们在看下渲染的html文件

  

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

{% load rbac_tags %}{% create_rbac_menu  menu_tile %}

  

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

 

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

你可能感兴趣的文章
Android Studio查看Android源代码失败
查看>>
Event loop (JavaScript中的执行机制)
查看>>
谈谈对Spring IOC的理解
查看>>
axios源码分析——取消请求
查看>>
java基础(三):谈谈java异常的处理
查看>>
React 零基础入坑
查看>>
使用code-printer生成一份炫酷的简历
查看>>
SQL 中的一些小巧但常用的关键字
查看>>
从实际案例中探讨io中的延迟性能的作用
查看>>
iOS开发 • 实例——Hey, 定时器!
查看>>
nodejs+express+mongodb+react+layui完整的小说阅读系统--悦读
查看>>
机器学习A-Z~支持向量机
查看>>
centos系统大量time wait占用的解决
查看>>
vue源码分析系列之响应式数据(三)
查看>>
Nginx服务系列——负载均衡
查看>>
力扣(LeetCode)21
查看>>
flac格式歌曲如何转换成mp3格式,flac转mp3详细图文教程
查看>>
微服务应用新趋势:Service Mesh、AIOps和中台化
查看>>
执行计划小总结
查看>>
再一次深入了解react的生命周期
查看>>