精华内容
下载资源
问答
  • """使用django 自带的用户控制权限的用户表"""user = models.OneToOneField(User,on_delete=models.CASCADE) # django自带用户表User模块...

    1、model

    from django.contrib.auth.models import User #django自带

    class UserProfile(models.Model):

    """使用django 自带的用户控制权限的用户表"""

    user = models.OneToOneField(User,on_delete=models.CASCADE) # django自带用户表User模块和自定义的用户关联

    name = models.CharField(max_length=32)

    roles = models.ManyToManyField("Role",blank=True,null=True)

    def __str__(self):

    return self.name

    class Role(models.Model):

    """角色表"""

    name = models.CharField(unique=True,max_length=32)

    menus = models.ManyToManyField("Menu")

    def __str__(self):

    return self.name

    2、view

    def app_index(request):

    return render(request, ‘kingadmin/app_index.html‘)

    3、html

    原文:https://www.cnblogs.com/yoyo008/p/9077933.html

    展开全文
  • 菜单权限的归属 : 1.设置表结构 : 在权限表中添加自连接的外键patent,parent_id连接permission表的id,可为空,当有parent_id时,...假设登录成功,经过view视图,将用户的权限和菜单结构保存在session中,其中需要...
    非菜单权限的归属 :
            1.设置表结构 : 在权限表中添加自连接的外键patent,parent_id连接permission表的id,可为空,当有parent_id时,说明它是一个普通的权限(子权限);当parent_id为空时,说明它是一个二级菜单(父权限).
     
            2.假设登录成功,经过view视图,将用户的权限和菜单结构保存在session中,其中需要把权限的id和子权限外连的id保存在permission_list中,并把权限的id保存在menu_dict中,供在inclusion_tag中进行比较.
            3.再次发送请求时,中间件会将请求中的路径进行分析,取出PERMISSION_SESSION_KEY中的pid以及id,如果pid存在,说明此次请求要操作的只是一个普通权限,定义并设置request.current_menu_id为其父权限的id,即:request.current_menu_id=pid;如果pid不存在,说明此次请求是对二级菜单的操作,所以直接设置request.current_menu_id=id.
            4.在回应请求时会经过自定义的inclusion_tag,会将保存在MENU_SESSION_KEY中的id取出,和request.current_menu_id进行比较,如果两者相等,则会给指定的权限中加上class=active属性,并去除其'hide'属性.
     

    转载于:https://www.cnblogs.com/wangtaobiu/p/10602715.html

    展开全文
  • 一级菜单排序 实现思路: 在一级菜单表中加一个权重字段,根据这个字段来排序。 weight = models.IntegerField(default=1) # 权重 左侧菜单栏根据这个来排序 那么获取用户权限时就要获取一下这个字段: def ...

    一.一级菜单排序

    实现思路:
    在一级菜单表中加一个权重字段,根据这个字段来排序。

     weight = models.IntegerField(default=1)  # 权重 左侧菜单栏根据这个来排序
    

    那么获取用户权限时就要获取一下这个字段:

    def permission(request,user_obj):
        # 登录认证
        request.session['is_login'] = True
    
        # 用户权限认证
        permissions_list = user_obj.roles.values(
            'Permissions__id',
            'Permissions__url',
            'Permissions__title',
            'Permissions__menus__weight',   # 权重
            'Permissions__menus__id',
            'Permissions__menus__title',
            'Permissions__menus__icon',
    
        ).distinct()
        request.session[settings.PERMISSIONS_KEY] = list(permissions_list)
    	
    	# 左侧菜单栏权限
        menu_dict = {}
        for menu in permissions_list:
            if menu.get('Permissions__menus__id'):
                if menu.get('Permissions__menus__id') in menu_dict:
                    menu_dict[menu.get('Permissions__menus__id')]['children'].append(
                        {'url': menu.get('Permissions__url'),
                         'title': menu.get('Permissions__title'),
                         }
                    )
                else:
                    menu_dict[menu.get('Permissions__menus__id')] = {
                        'title':menu.get('Permissions__menus__title'),   # 一级菜单
                        'icon':menu.get('Permissions__menus__icon'),     # 一级菜单icon 图标
                        'weight': menu.get('Permissions__menus__weight'), # 权重 用来排序用
                        'children':[
                            {'url':menu.get('Permissions__url'),
                             'title':menu.get('Permissions__title'),
                             }  # 二级菜单
                        ]
                    }
        request.session[settings.MENU_KEY] = menu_dict
    

    自定义标签中:

    from django import template
    from django.conf import settings
    from collections import OrderedDict
    
    register = template.Library()
    
    @register.inclusion_tag('menu.html')
    def menu(request):
        menu_dict = request.session.get(settings.MENU_KEY)
        current_path = request.path
        order_dict = OrderedDict()  # 有序字典对象
        keys = sorted(menu_dict,key=lambda x:menu_dict[x]['weight'],reverse=True)  #  1 2
        for sorts in keys:
            order_dict[sorts] = menu_dict[sorts]
    

    数据库中财务管理的值比销售管理的值大:
    在这里插入图片描述
    效果:
    在这里插入图片描述

    二.保留二级菜单默认展开效果

    自定义标签中加下面这段代码:
    首先给所有的二级菜单加一个hidden效果全部收起来,如果访问的url匹配到二级菜单的路径就让class值等于空,展开效果。

    for key,values in order_dict.items():
        values['class'] = 'hidden'
        for i in values['children']:
            if re.match(i['url'],current_path):
                values['class'] = ''
    

    menu.html文件中:

    <div class="multi-menu">
        {% for menu_k,menu_v in menu_dict.items %}
            <div class="item">
            <div class="title"> {{ menu_v.title }}</div>
                <div class="body {{ menu_v.class }}">
                    {% for ermenu in menu_v.children %}
                        <a href="{{ ermenu.url }}">{{ ermenu.title }}</a>
                    {% endfor %}
                </div>
            </div>
        {% endfor %}
    </div>
    

    三.二级菜单的点击效果

    需求:点击的二级菜单想要有选中的效果。
    如果访问的url匹配到二级菜单的路径就给所有的二级菜单加一个值class=active。
    代码:

    for key,values in order_dict.items():
        values['class'] = 'hidden'
        for i in values['children']:
            if re.match(i['url'],current_path):
                values['class'] = ''
                i['class'] = 'active'
    

    menu.html:

    <div class="multi-menu">
        {% for menu_k,menu_v in menu_dict.items %}
            <div class="item">
            <div class="title"> {{ menu_v.title }}</div>
                <div class="body {{ menu_v.class }}">
                    {% for ermenu in menu_v.children %}
                        <a href="{{ ermenu.url }}" class="{{ ermenu.class }}">{{ ermenu.title }}</a>
                    {% endfor %}
                </div>
            </div>
        {% endfor %}
    </div>
    

    效果:
    在这里插入图片描述

    四.二级菜单权限访问时二级菜单默认展开

    出现的问题:
    点击其他功能项时,左侧菜单栏会收起。
    解决思路:
    在权限表中加一个字段外键到他自己这张表,如果是二级菜单那么值就是None,如果不是二级菜单就记录当前这个路径属于哪个二级菜单。
    在这里插入图片描述
    首先先要把parent_id和二级菜单的他自己的id写到session中,方便后续用:

    def permission(request,user_obj):
        # 登录认证
        request.session['is_login'] = True
    
        # 权限认证
        permissions_list = user_obj.roles.values(
            'Permissions__id',
            'Permissions__url',
            'Permissions__title',
            'Permissions__parent_id',       # 用来记录二级菜单的子菜单
            'Permissions__menus__weight',   # 权重
            'Permissions__menus__id',
            'Permissions__menus__title',
            'Permissions__menus__icon',
    
        ).distinct()
        request.session[settings.PERMISSIONS_KEY] = list(permissions_list)
    
        menu_dict = {}
        for menu in permissions_list:
            if menu.get('Permissions__menus__id'):
                if menu.get('Permissions__menus__id') in menu_dict:
                    menu_dict[menu.get('Permissions__menus__id')]['children'].append(
                        {'url': menu.get('Permissions__url'),
                         'title': menu.get('Permissions__title'),
                         'id': menu.get('Permissions__id'),   # 当前二级菜单的id
                         }
                    )
                else:
                    menu_dict[menu.get('Permissions__menus__id')] = {
                        'title':menu.get('Permissions__menus__title'),   # 一级菜单
                        'icon':menu.get('Permissions__menus__icon'),     # 一级菜单icon 图标
                        'weight': menu.get('Permissions__menus__weight'),
                        'children':[
                            {'url':menu.get('Permissions__url'),
                             'title':menu.get('Permissions__title'),
                             'id': menu.get('Permissions__id'),     # 当前二级菜单的id
                             }  # 二级菜单
                        ]
                    }
        request.session[settings.MENU_KEY] = menu_dict
    

    怎么样获取到二级菜单中的parent_id呢,之前是在中间件做的路径权限认证,可以在这里把获取parent_id进行记录。

     # 获取二级菜单的子菜单
     pid =permission_path.get('Permissions__parent_id')
     if pid:
         # 获取到了就记录这个子菜单的id
         request.current_id = pid
     else:
         # 如果获取不到子菜单的id 那么current_id就等于当前二级菜单的id
         request.current_id = permission_path.get('Permissions__id')
    
     return None
    

    自定义标签中稍作改动:

    for key,values in order_dict.items():
        values['class'] = 'hidden'
        for i in values['children']:
        	# 不再用正则匹配了,这里获取到的是二级菜单的子菜单那么点击的时候也会有下面两个效
        	# 果,如果获取不到parent_id那么就是当前二级菜单的id,也会有下面两个效果,可谓是两全其美
            if request.current_id == i.get('id'):
                values['class'] = ''
                i['class'] = 'active'
    

    五.路径导航-面包屑

    需求:
    想做下面这种带有路径导航的功能
    在这里插入图片描述
    实现思路:
    先往request里面放一个列表,后续根据点击的路劲往里放不同的url。

    request.bread_crumbs = [    # 面包屑
        {'url':reverse('app05:index'),'title':'首页'},
    ]
    

    第一种实现方法:

    # 获取二级菜单的子菜单
    pid =permission_path.get('Permissions__parent_id')
    
    # 拿到pid之后,去权限表中查如果id等于parent_id就代表这个路径是二级菜单下的子菜单,后面就获取这个id的url和title
    ret = models.Permission.objects.filter(pk=pid).first()
    if pid:
        # 获取到了就记录这个子菜单的id
        request.current_id = pid
    
        # 二级菜单
        request.bread_crumbs.append({
            'url': ret.url,
            'title': ret.title,
        })
    
        # 二级菜单下的子菜单
        request.bread_crumbs.append({
            'url': None,
            'title': permission_path.get('Permissions__title'),
        })
    else:
    	# 这里如果获取不到parent_id就代表是二级菜单,往里面加二级菜单的url和title
        request.bread_crumbs.append({
            'url':None,
            'title':permission_path.get('Permissions__title'),
        })
        # 如果获取不到子菜单的id 那么current_id就等于当前二级菜单的id
        request.current_id = permission_path.get('Permissions__id')
    

    第二种实现方法:
    第一种实现方法要操作数据库,效率有点低,这里实现另外一种方法:
    实现思路:
    将权限表中的每一条数据id作为键,剩下的url title等作为值,组成一个新字典,然后根据
    获取到的parent_id去查这个新字典的值。
    代码:

    permissions_list = user_obj.roles.values(
        'Permissions__id',
        'Permissions__url',
        'Permissions__title',
        'Permissions__parent_id',       # 用来记录二级菜单的子菜单
        'Permissions__menus__weight',   # 权重
        'Permissions__menus__id',
        'Permissions__menus__title',
        'Permissions__menus__icon',
    
    ).distinct()
    
    # 将permissions_list重新组数据,之前是list类型
    # 现在数据格式是:{1:{url:xx,title:xx}}
    # 通过permissions_dict[parent_id][url] 来获取子菜单的url和title
    permissions_dict = {}
    for permissions in permissions_list:
        permissions_dict[permissions.get('Permissions__id')] = permissions
    
    request.session[settings.PERMISSIONS_KEY] = permissions_dict
    

    最终的方式:

    # 获取二级菜单的子菜单
    pid =permission_path.get('Permissions__parent_id')
    ret = models.Permission.objects.filter(pk=pid).first()
    if pid:
        # 获取到了就记录这个子菜单的id
        request.current_id = pid
    
        # 二级菜单
        # 第一种方式:
        # request.bread_crumbs.append({
        #     'url': ret.url,
        #     'title': ret.title,
        # })
    
        # 第二种方式:
        request.bread_crumbs.append({
            'url': permission_path_dict[str(pid)]['Permissions__url'],
            'title': permission_path_dict[str(pid)]['Permissions__title'],
        })
    
        # 二级菜单下的子菜单
        request.bread_crumbs.append({
            'url': None,
            'title': permission_path.get('Permissions__title'),
        })
    else:
        request.bread_crumbs.append({
            'url':None,
            'title':permission_path.get('Permissions__title'),
        })
        # 如果获取不到子菜单的id 那么current_id就等于当前二级菜单的id
        request.current_id = permission_path.get('Permissions__id')
    

    html中:

     {% for crumb in request.bread_crumbs %}
          {% if crumb.url %}
          <li><a href="{{ crumb.url }}">{{ crumb.title }}</a></li>
              {% else %}
              <li class="active">{{ crumb.title }}</li>
          {% endif %}
      {% endfor %}
    

    六.权限精确到按钮级别

    需求:
    没有权限的按钮不显示出来。
    实现思路:
    在权限表中加一个字段url_name用来标识路径别名,将url_name的值取出来放到session中,自定义一个过滤器,如果urls.py中设置的别名在session中就显示,不在则不显示。
    代码实现:
    数据库中加一个字段:

    url_name = models.CharField(max_length=32,unique=True)
    

    获取url_name别名并放到session中:

    url_name_list = []
    url_name_list.append(menu.get('Permissions__url_name'))
    request.session['url_name'] = url_name_list   # 别名
    

    自定义过滤器:

    @register.filter
    def url_name_filer(name,request):
        # 路径是否在url_name中
        if name in request.session['url_name']:
            return True
        else:
            return False
    

    前端HTML根据返回的结果做判断:

    {% extends 'layout.html' %}
    {% load mytag %}    # 加载一下自定义标签
    {% block content %}
        {% if 'customer_add'|url_name_filer:request %}
            <h1><a href="{% url 'app05:customer_add' %}">添加客户记录</a></h1>
        {% endif %}
        <form action="" method="post">
            {% csrf_token %}
            <table class="table table-bordered table-hover">
                <thead>
                <tr>
                    <th>序号</th>
                    <th>姓名</th>
                    <th>年龄</th>
                    <th>邮箱</th>
                    <th>公司</th>
                    {% if 'customer_del'|url_name_filer:request or 'customer_edit'|url_name_filer:request %}
                    <th>操作</th>
                    {% endif %}
                </tr>
                </thead>
                <tbody>
                {% for customer in customer_obj %}
                    <tr>
                        <td>{{ forloop.counter }}</td>
                        <td>{{ customer.name }}</td>
                        <td>{{ customer.age }}</td>
                        <td>{{ customer.email }}</td>
                        <td>{{ customer.company }}</td>
                     {% if 'customer_del'|url_name_filer:request or 'customer_edit'|url_name_filer:request %}
                            <td>
                                {% if 'customer_edit'|url_name_filer:request %}
                                <a href="{% url 'app05:customer_edit' customer.id %}"><i class="fa fa-edit"></i></a>
                                {% endif %}
                                {% if 'customer_del'|url_name_filer:request %}
                                <a href="{% url 'app05:customer_del' customer.id %}"><i class="fa fa-remove"></i></a>
                                {% endif %}
                            </td>
                    {% endif %}
                    </tr>
                {% endfor %}
                </tbody>
            </table>
            <button class="btn btn-success">提交</button>
        </form>
    {% endblock %}
    

    效果:
    什么权限也没有
    在这里插入图片描述

    展开全文
  • django 菜单权限

    2018-11-15 13:59:00
    web应用中,所谓的权限,其实就是一个用户能够访问的url,通过对用户访问的url进行控制,从而实现对用户权限的控制. 每个用户代表不同的的角色,每个角色具有不同的权限. 一个用户可以有多重角色,多个人也可以是一种...

    一.什么是权限

     能做哪些事情,不能做哪些事情,可以做的权限

    二.设计权限

    思路:

    web应用中,所谓的权限,其实就是一个用户能够访问的url,通过对用户访问的url进行控制,从而实现对用户权限的控制.

    每个用户代表不同的的角色,每个角色具有不同的权限.

    一个用户可以有多重角色,多个人也可以是一种角色(比如说一个公司可以有多个销售),所以说,用户与角色之间的关系是多对多的关系.

    一个角色能够拥有多个权限,一个权限也可以分配给多个角色;所以说角色和权限的关系也是多对多的关系.

     

     

     

    三.权限实现

    建立表关系

    具体代码如下:

    from django.db import models
    
    
    class Menu(models.Model):
        title = models.CharField(max_length=32)
        icon = models.CharField(max_length=32)
        weight = models.IntegerField(default=1, verbose_name='权重')
    class Permission(models.Model):
        """
        权限表
        """
        title = models.CharField(max_length=32, verbose_name='标题')
        url = models.CharField(max_length=32, verbose_name='权限')
        
        menu = models.ForeignKey(to='Menu',on_delete=models.CASCADE,default=0,blank=True,null=True)
        pid = models.ForeignKey('self',on_delete=models.CASCADE,null=True,verbose_name='父权限')
    
        name = models.CharField(max_length=32, null=True, blank=True, unique=True)
        
        class Meta:
            verbose_name_plural = '权限表'
            verbose_name = '权限表'
        
        def __str__(self):
            return self.title
    
    
    class Role(models.Model):
        name = models.CharField(max_length=32, verbose_name='角色名称')
        permissions = models.ManyToManyField(to='Permission', verbose_name='角色所拥有的权限', blank=True)
        
        def __str__(self):
            return self.name
    
    
    class User(models.Model):
        """
        用户表
        """
        name = models.CharField(max_length=32, verbose_name='用户名')
        password = models.CharField(max_length=32, verbose_name='密码')
        roles = models.ManyToManyField(to='Role', verbose_name='用户所拥有的角色', blank=True)
    
        def __str__(self):
            return self.name

     

    获取权限信息

    每次当用户一登录是,就应该获取当前的用户所拥有的所有权限信息.

    当然了首先需要构建的应该是当前用户的权限列表中.构建出来之后将其存入到session中,以便于之后的权限校验

    这里还需要构造出我们创建菜单想要的数据结构,以便于之后创建二级菜单.

    然后我们构建出来的菜单数据结构和权限列表如下所示:

    permission_list[{
        'url': '/customer/',
        'pid': None,
        'title': '全部客户',
        'id': 1
    }, {
        'url': '/customers/list/',
        'pid': None,
        'title': '共有客户',
        'id': 2
    }, {
        'url': '/mycustomers/',
        'pid': None,
        'title': '我的客户',
        'id': 3
    }, {
        'url': '/consult_records/',
        'pid': None,
        'title': '客户跟进记录',
        'id': 4
    }, {
        'url': '/customer/count/',
        'pid': None,
        'title': '客户成单统计',
        'id': 5
    }, {
        'url': '/enrollment/',
        'pid': None,
        'title': '报名情况',
        'id': 6
    }, {
        'url': '/enrollment/add/',
        'pid': 6,
        'title': '添加报名记录',
        'id': 7
    }, {
        'url': '/enrollment/edit/(\\d+)',
        'pid': 6,
        'title': '修改报名记录',
        'id': 8
    }, {
        'url': '/ClassStudyRecord/list/',
        'pid': None,
        'title': '班级学习记录',
        'id': 9
    }, {
        'url': '/ClassStudyRecord/add/',
        'pid': 9,
        'title': '添加学习记录',
        'id': 10
    }, {
        'url': '/studentstudyrecord/edit/(\\d+)/',
        'pid': 9,
        'title': '添加记录',
        'id': 11
    }, {
        'url': '/rbac/role/list/',
        'pid': None,
        'title': '角色管理',
        'id': 12
    }, {
        'url': '/rbac/role/add/',
        'pid': 12,
        'title': '添加角色',
        'id': 13
    }, {
        'url': '/rbac/role/edit/(\\d+)',
        'pid': 12,
        'title': '修改角色',
        'id': 14
    }, {
        'url': '/rbac/role/del/(\\d+)',
        'pid': 12,
        'title': '删除角色',
        'id': 15
    }, {
        'url': '/rbac/menu/list/',
        'pid': None,
        'title': '菜单管理',
        'id': 16
    }, {
        'url': '/rbac/menu/add/',
        'pid': 16,
        'title': '添加目录',
        'id': 17
    }, {
        'url': '/rbac/menu/edit/(\\d+)',
        'pid': 16,
        'title': '修改目录',
        'id': 18
    }, {
        'url': '/rbac/permission/distrbute/',
        'pid': None,
        'title': '分配权限',
        'id': 19
    }, {
        'url': '/rbac/permission/tree/',
        'pid': 19,
        'title': '权限树',
        'id': 20
    }, {
        'url': '/index/',
        'pid': None,
        'title': '首页',
        'id': 21
    }, {
        'url': '/logout/',
        'pid': None,
        'title': '注销',
        'id': 22
    }, {
        'url': '/customers/add/',
        'pid': 1,
        'title': '添加客户',
        'id': 23
    }, {
        'url': '/customers/add/',
        'pid': 2,
        'title': '添加客户',
        'id': 24
    }, {
        'url': '/customers/add/',
        'pid': 3,
        'title': '添加客户',
        'id': 25
    }, {
        'url': '/customer/del/(\\d+)/',
        'pid': 1,
        'title': '删除客户',
        'id': 26
    }, {
        'url': '/customer/del/(\\d+)/',
        'pid': 2,
        'title': '删除客户',
        'id': 27
    }, {
        'url': '/customer/del/(\\d+)/',
        'pid': 3,
        'title': '删除客户',
        'id': 28
    }, {
        'url': '/customers/edit/(\\d+)',
        'pid': 1,
        'title': '修改客户',
        'id': 29
    }, {
        'url': '/customers/edit/(\\d+)',
        'pid': 2,
        'title': '修改客户',
        'id': 30
    }, {
        'url': '/customers/edit/(\\d+)',
        'pid': 3,
        'title': '修改客户',
        'id': 31
    }, {
        'url': '/consult_records/add/',
        'pid': 4,
        'title': '添加客户跟进记录',
        'id': 32
    }, {
        'url': '/consult_records/(\\d+)',
        'pid': 4,
        'title': '修改客户跟进记录',
        'id': 33
    }, {
        'url': '/del_consult/(\\d+)',
        'pid': 4,
        'title': '删除客户跟进记录',
        'id': 34
    }]
    权限列表
    permission_menu_dic {
        '2': {
            'menu_title': '客户管理',
            'menu_icon': 'nav-icon fa fa-dashboard',
            'childern': [{
                'title': '全部客户',
                'url': '/customer/'
            }, {
                'title': '共有客户',
                'url': '/customers/list/'
            }, {
                'title': '我的客户',
                'url': '/mycustomers/'
            }, {
                'title': '客户跟进记录',
                'url': '/consult_records/'
            }, {
                'title': '客户成单统计',
                'url': '/customer/count/'
            }]
        },
        '3': {
            'menu_title': '报名管理',
            'menu_icon': 'nav-icon fa fa-table',
            'childern': [{
                'title': '报名情况',
                'url': '/enrollment/'
            }]
        },
        '4': {
            'menu_title': '成绩管理',
            'menu_icon': 'nav-icon fa fa-th',
            'childern': [{
                'title': '班级学习记录',
                'url': '/ClassStudyRecord/list/'
            }]
        },
        '5': {
            'menu_title': '权限管理',
            'menu_icon': 'nav-icon fa fa-tree',
            'childern': [{
                'title': '角色管理',
                'url': '/rbac/role/list/'
            }, {
                'title': '菜单管理',
                'url': '/rbac/menu/list/'
            }, {
                'title': '分配权限',
                'url': '/rbac/permission/distrbute/'
            }]
        }
    }
    permission_menu_dic {
        '2': {
            'menu_title': '客户管理',
            'menu_icon': 'nav-icon fa fa-dashboard',
            'childern': [{
                'title': '全部客户',
                'url': '/customer/',
                'active': 'active'
            }, {
                'title': '共有客户',
                'url': '/customers/list/'
            }, {
                'title': '我的客户',
                'url': '/mycustomers/'
            }, {
                'title': '客户跟进记录',
                'url': '/consult_records/'
            }, {
                'title': '客户成单统计',
                'url': '/customer/count/'
            }],
            'style': 'display:block',
            'class': 'menu-open'
        },
        '3': {
            'menu_title': '报名管理',
            'menu_icon': 'nav-icon fa fa-table',
            'childern': [{
                'title': '报名情况',
                'url': '/enrollment/'
            }]
        },
        '4': {
            'menu_title': '成绩管理',
            'menu_icon': 'nav-icon fa fa-th',
            'childern': [{
                'title': '班级学习记录',
                'url': '/ClassStudyRecord/list/'
            }]
        },
        '5': {
            'menu_title': '权限管理',
            'menu_icon': 'nav-icon fa fa-tree',
            'childern': [{
                'title': '角色管理',
                'url': '/rbac/role/list/'
            }, {
                'title': '菜单管理',
                'url': '/rbac/menu/list/'
            }, {
                'title': '分配权限',
                'url': '/rbac/permission/distrbute/'
            }]
        }
    }
    菜单数据

     具体构建代码如下:

    from rbac.models import Role
    
    
    def initial_sesson(user,request):
        """
        功能:将当前登录人的所有权限录入session中
        :param user: 当前登录人
        """
        # 查询当前登录人的所有权限列表
        # 查看当前登录人的所有角色
        # ret=Role.objects.filter(user=user)
        permissions = Role.objects.filter(userinfo=user).values("permissions__url",
                                                            "permissions__title",
                                                            'permissions__pid',
                                                            'permissions__pk',
                                                            "permissions__menu__pk",
                                                            "permissions__menu__title",
                                                            "permissions__menu__icon",
                                                            ).distinct()
        print('permissions',permissions)
    
    
        permission_list = []
        permission_menu_dic = {}
    
        for item in permissions:
            # 构建权限列表
            permission_list.append({
                'url':item["permissions__url"],
                'pid':item["permissions__pid"],
                'title':item["permissions__title"],
                'id':item["permissions__pk"],
    
            })
            # 构建菜单权限列表
            if item["permissions__menu__pk"]:
                if not permission_menu_dic.get(item['permissions__menu__pk']):
    
                    permission_menu_dic[item['permissions__menu__pk']] = {
                        'menu_title':item['permissions__menu__title'],
                        'menu_icon':item['permissions__menu__icon'],
                        'childern':[{
                            'title':item['permissions__title'],
                            'url':item['permissions__url']
                        }]
                    }
                else:
    
                    permission_menu_dic[item['permissions__menu__pk']]['childern'].append({
                        'title':item['permissions__title'],
                        'url':item['permissions__url']
                    })
    
        print('permission_menu_dic',permission_menu_dic)
        # 将当前登录人的权限列表注入session中
        request.session["permission_list"] = permission_list
        # 将当前登录人的菜单权限列表注入session中
        print("permission_list",permission_list)
        request.session["permission_menu_dic"] = permission_menu_dic

     构建菜单:

    这里使用的django的自定义标签incluSion_tags.

    首先创建一个templatetags文件夹,(注意这个文件夹的名字必须是这个名字)

    其次创建一个py文件,这个文件名可以随意.

    代码如下:

    from django.utils.safestring import mark_safe
    from django.template import Library
    import re
    register =Library()
    
    
    @register.inclusion_tag("rbac/menu.html")
    def get_menu_styles(request):
        permission_menu_dic = request.session.get("permission_menu_dic")
        print('permission_menu_dic',permission_menu_dic)
        for val in permission_menu_dic.values():
            for item in val.get('childern'):
                if  re.search('^{}$'.format(item['url']),request.path):
                    val['style'] = 'display:block'
                    val['class'] = 'menu-open'
                    item['active'] = 'active'
        print("permission_menu_dic",permission_menu_dic)
        return {"permission_menu_dic":permission_menu_dic}
    自定义菜单标签

     这里还需要一个菜单的模板:

        {% for item in permission_menu_dic.values %}
            <li class="nav-item has-treeview {{ item.class }}">
                <a href="#" class="nav-link">
                     <i class="{{ item.menu_icon }}"></i>
                    <p>
                       {{ item.menu_title }}
                        <i class="right fa fa-angle-left"></i>
                    </p>
                </a>
    
                <ul class="nav nav-treeview" style="{{ item.style }}">
                    {% for foo in item.childern %}
                        <li class="nav-item">
                        <a href="{{ foo.url }}" class="nav-link {{ foo.active }}">
                            <i class="fa fa-circle-o nav-icon"></i>
                            <p>{{ foo.title }}</p>
                        </a>
                    </li>
    
                    {% endfor %}
                </ul>
            </li>
        {% endfor %}
    menu

     这里的菜单css和js可以自己进行定制.我这里使用的是bootstrap的模板.

     

    自此,菜单以及菜单权限就构建完成!

    转载于:https://www.cnblogs.com/baijinshuo/p/9963125.html

    展开全文
  • #模板class IndexForm(forms.Form):# 模板,用户提交的name和这里的变量名一定要是一致的.否则不能获取数据user = forms.CharField(min_length=6, error_messages={'required': '用户名不能为空', 'min_length': '...
  • 1、 自定义菜单 adminx.py class GlobalSetting(object): site_title = u'xxx后台' def kuF_site_menu(self): return [{ 'title': u'用户&账户', 'perm': self.get_model_perm(User, 'view'), 'icon':'fa fa-...
  • django xadmin自定义菜单

    2019-10-09 09:12:06
    1. 自定义菜单 adminx.py class GlobalSetting(object): site_title = u'xxx后台' def kuF_site_menu(self): return [{ 'title': u'用户&账户', 'perm': self.get_model_perm(User, 'view'), ...
  • Django之左侧菜单栏权限和二级菜单

    千次阅读 2020-05-26 16:23:15
    在Permission表中加一个字段用来标记是否是左侧菜单,通过这个字段来判断用户是否有左侧菜单栏的权限。 class Permission(models.Model): url = models.CharField(max_length=48) title = models.CharField(max_...
  • 以上这篇Django 实现xadmin后台菜单改为中文就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持软件开发网。 您可能感兴趣的文章:django+xadmin+djcelery实现后台管理定时任务Dja
  • Django权限管理 ...实现动态生成用户权限菜单(可设置多级菜单嵌套)、根据前台URL自动选中菜单并折叠其余菜单 最终实现类似这样的效果: 菜单一  菜单1.1  菜单1.2  菜单1.2.1  ...
  • 1、model from django.contrib.auth.models import User #django自带 ... """使用django 自带的用户控制权限的用户表""" user = models.OneToOneField(User,on_delete=models.CASCADE) # dja...
  • django crm 左侧菜单

    2019-06-17 21:19:00
    给permission表加一项 , is_menu, 值为True表示要在左侧菜单栏中显示,值为False表示不需要在左侧菜单栏中显示 将权限向session中注入的时候,注入两个列表 permission_list 列表 表示所有权限,用于在中间...
  • Django Vue实现动态菜单、动态权限

    千次阅读 2019-07-27 22:30:42
    随着前后端分离架构的流行,在 web 应用中,RESTful API 几乎已经成为了开发者主要选择,它使得客户端和服务端不需要保存对方的详细信息,也就是无状态性,但是这样在项目中需要动态菜单和动态权限就困难起来,本场...
  • 一、环境要求:python版本:Python3.6.4web框架:Django2.0.2开发工具:Eclipse+Pydev...验证通过后,登录成功,调整首页2、首页:左侧菜单(粗糙)--多级菜单3、用户管理--添加用户--跳转用户添加页面,提交数据库...
  • 利用django实现了省市县的级联下拉。数据库采用的是sqlite。
  • 后台首页菜单根据用户权限动态生成,不同菜单对应不同的功能视图。菜单的增删改查。 2.功能分析 菜单列表 添加菜单 修改菜单 删除菜单 3.模型设计 字段分析 name url parent order permission icon codename is_...
  • [django项目] 后台菜单管理功能

    千次阅读 2019-09-04 07:58:17
    后台首页菜单根据用户权限动态生成,不同菜单对应不同的功能视图。 菜单的增删改查。 2>功能分析 菜单列表 添加菜单 修改菜单 删除菜单 3>模型设计 3.1>字段分析 name, 菜单名 url, 菜单的路由 parent, ...
  • django 用了内置的自带权限用户功能(自带的表) 如何增加用户菜单、路由等,小白小白求教。 就是前台根据后台返回的数据显示菜单,还有对权限的操作部分 不知道怎么弄 增删改查权限,现在只能用自带的view table_...
  • django 权限设置-菜单显示

    千次阅读 2018-11-15 11:52:00
    问题:在用户登录后,如何只显示出用户权限的菜单呢?需要设置显示菜单权限 1.为了显示菜单,需要在models权限上添加is_menu(手动判断是否是查看)的icon(图标字符串) 在rbac中录入另一个的权限,判断是否显示菜单的,...
  • 我试图创建一个django页面,它有一个下拉输入,引用一个包含数千个条目的数据库,当用户选择其中一个条目并点击“提交”时,它会将它们重定向到一个html页面,该页面生成他们选择的项的统计信息。我试了好几次,但都...
  • Django xadmin后台菜单改为中文

    千次阅读 2017-10-25 01:33:23
    应用目录下apps.py class OperationConfig(AppConfig): name = 'operation' verbose_name = u"用户操作" __init__.py default_app_config = "operation.apps.OperationConfig
  • 这是一个小型库,可让您在 Django 模型管理页面中定义交错的下拉菜单。 例如,您可以拥有顶级“国家/地区”下拉列表和“州/省”下拉列表,并在用户每次更新“国家/地区”字段时将州/省限制为合理值。 交错选择需要...
  • django

    2018-06-21 14:52:38
    概述RBAC(Role-Based Access Control,基于角色的访问控制),通过角色绑定权限,然后给用户划分角色。在web应用中,可以将权限理解为url,一个权限对应一个url。在实际应用中,url是依附在菜单下的,比如一个简单的...
  • 今天把之前关于博客中用户的登录和退出功能完善,以及对用户的个人资料功能的添加,验证菜单只有用户登录的情况下才能访问等,接下来开始:首先修改django_projectdjango_projecturls.py,添加个人信息、登录、退出三...
  • Django

    2019-11-15 11:05:28
    章节1:Django预热 1【虚拟环境】为什么需要虚拟环境06:30 2【虚拟环境】virtualenv创建虚拟环境13:57 3【虚拟环境】virtualenvwrapper使用16:44 4【Django预热】URL组成部分详解14:04 5【Django预热】课程准备工作...
  • 文章目录1. 背景分析最原始的目录结构改造之后的目录结构最终达到的效果2. 原理分析以及实现思路3. 提升可配置性4. 核心算法5....   随着admin后台二级菜单的增多,我们会发现管理起来会非常的麻烦

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 4,805
精华内容 1,922
关键字:

django用户菜单