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传参不需要"|"来进行传参

  • 相关阅读:
    Oracle中有大量的sniped会话
    Error 1130: Host '127.0.0.1' is not allowed to connect to this MySQL server
    汉字转换为拼音以及缩写(javascript)
    高效率随机删除数据(不重复)
    vs2010 舒服背景 优雅字体 配置
    mvc中的ViewData用到webfrom中去
    jquery ajax return值 没有返回 的解决方法
    zShowBox (图片放大展示jquery版 兼容性好)
    动感效果的TAB选项卡 jquery 插件
    loading 加载提示······
  • 原文地址:https://www.cnblogs.com/bainianminguo/p/10023894.html
Copyright © 2011-2022 走看看