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来实现

Django的Rbac介绍3详解编程语言

 这个函数的意思就是,将函数的返回值,渲染到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传参不需要”|”来进行传参

原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/20784.html

(0)
上一篇 2021年7月19日
下一篇 2021年7月19日

相关推荐

发表回复

登录后才能评论