zoukankan      html  css  js  c++  java
  • 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传参不需要"|"来进行传参

  • 相关阅读:
    jquery 获取easyui combobox选中的值
    一个多余逗号引起的麻烦
    Microsoft.Office.Interop.Excel 放到B/S客户端失败问题 检索 COM 类工厂中 CLSID 为 {00024500-0000-0000-C000-000000000046} 的组件失败,原因是出现以下错误: 80070005 拒绝访问。
    自己收藏-javascript用window.open的子窗口关闭自己并且刷新父窗口
    easyUI datagrid 不刷新问题
    水晶报表中公式字段if else 语句无法正常执行的问题
    SQL SERVER 察看数据库连接池情况
    Data Table 转 List<Type>
    .Net 调用SAP RFC
    VS2017 插件介绍
  • 原文地址:https://www.cnblogs.com/bainianminguo/p/10023894.html
Copyright © 2011-2022 走看看