zoukankan      html  css  js  c++  java
  • django 权限设置-菜单显示

    问题:
    在用户登录后,如何只显示出用户权限的菜单呢?
    需要设置显示菜单权限

    1.为了显示菜单,需要在models权限上添加is_menu(手动判断是否是查看)的icon(图标字符串)

    在rbac中录入另一个的权限,判断是否显示菜单的,若是没有,返回一个空列表[],有则添加session中permission_menu_list=[{},{}]

     1 from rbac.models import Role
     2 
     3 
     4 def initial_sesson(user,request):
     5     """
     6     功能:将当前登录人的所有权限录入session中
     7     :param user: 当前登录人
     8     """
     9     # 查询当前登录人的所有权限列表
    10     # 查看当前登录人的所有角色
    11     # ret=Role.objects.filter(user=user)
    12     permissions = Role.objects.filter(user=user).values("permissions__url",
    13                                                         "permissions__is_menu",
    14                                                         "permissions__title",
    15                                                         "permissions__icon",
    16                                                         ).distinct()
    17     print(permissions)
    18 
    19     permission_list = []
    20     permission_menu_list = []
    21 
    22     for item in permissions:
    23         # 构建权限列表
    24         permission_list.append(item["permissions__url"])
    25 
    26         # 构建菜单权限列表
    27         if item["permissions__is_menu"]:
    28             permission_menu_list.append({
    29                 "title":item["permissions__title"],
    30                 "icon":item["permissions__icon"],
    31                 "url":item["permissions__url"],
    32             })
    33 
    34     # 将当前登录人的权限列表注入session中
    35     request.session["permission_list"] = permission_list
    36     # 将当前登录人的菜单权限列表注入session中
    37     print("permission_menu_list",permission_menu_list)
    38     request.session["permission_menu_list"] = permission_menu_list
    rbac

    2.在登录成功后,在菜单区域(side_bar):渲染出菜单链接标签:

    def get_menu_styles(request):
    permission_menu_list = request.session.get("permission_menu_list")
    for item in permission_menu_list:
    if re.search("^{}$".format(item["url"]), request.path):
    item["class"] = "active"

    return {"permission_menu_list":permission_menu_list}

    {% for item in request.session.permission_menu_list %}
                   <p><a href="{{ item.url }}">{{ item.title }}</a></p>
             {% endfor %}

    3.点击标签加入active样式:

     解决思路1:
                每一个返回母版的视图函数中:
                    permission_menu_list = request.session.get("permission_menu_list")
                    for item in permission_menu_list:
                        if re.search("^{}$".format(item["url"]), request.path):
                            item["class"] = "active"
                
            解决思路2:    引入inclusion_tag方法:
                    @register.inclusion_tag("rbac/menu.html")
                    def get_menu_styles(request):
                        permission_menu_list = request.session.get("permission_menu_list")
                        for item in permission_menu_list:
                            if re.search("^{}$".format(item["url"]), request.path):
                                item["class"] = "active"

                        return {"permission_menu_list":permission_menu_list}
                
                
                在layout.html中:
                         <div class="menu-body">
                
                               {% load web %}
                               {% get_menu_styles request %}

                        </div>

    4.这里用到自定义标签

    自定义过滤器和标签




    1 在settings中的INSTALLED_APPS配置当前app,不然django无法找到自定义的simple_tag.

    2 在app中创建templatetags模块(模块名只能是templatetags)

    3 创建任意 .py 文件,如:my_tags.py
            

                from django import template
                from django.utils.safestring import mark_safe
                register = template.Library()   #register的名字是固定的,不可改变
                
                @register.filter
                def filter_multi(v1,v2):
                    return  v1 * v2

    4  在使用自定义simple_tag和filter的html文件中导入之前创建的 my_tags.py
            {% load my_tags %} 

    5 使用
        在模板中:
        
        # num=12
        {% load my_tags %} 
        {{ num|filter_multi:2 }} #24

    新建的trmplatewares里 的rbac 标签过滤器

     1 from django.template import Library
     2 import re
     3 register =Library()
     4 
     5 
     6 @register.inclusion_tag("rbac/menu.html")
     7 def get_menu_styles(request):
     8     permission_menu_list = request.session.get("permission_menu_list")
     9     for item in permission_menu_list:
    10         if re.search("^{}$".format(item["url"]), request.path):
    11             item["class"] = "active"
    12 
    13     return {"permission_menu_list":permission_menu_list}
    rbac
    1 <div class="static-menu">
    2 
    3         {% for item in permission_menu_list %}
    4             <a href="{{ item.url }}" class="{{ item.class }}">
    5                 <span class="icon-wrap"><i class="fa {{ item.icon }}"></i></span> {{ item.title }}
    6             </a>
    7         {% endfor %}
    8 
    9 </div>
    menu
    1         <div class="menu-body">
    2 
    3                {% load web %}
    4                {% get_menu_styles request %}
    5 
    6         </div>
    引用

    其他过滤器

     1 from django.utils.safestring import mark_safe
     2 
     3 from django.template import Library
     4 register =Library()
     5 
     6 
     7 @register.filter
     8 def mul(x,y):
     9     return x*y
    10 
    11 @register.filter
    12 def tag(val):
    13 
    14     return mark_safe("<a>%s</a>"%val)
    15 
    16 @register.filter
    17 def lower(val):
    18 
    19     return val.lower()
    20 
    21 @register.simple_tag
    22 def mul_tag(x,y,z):
    23     return x*y*z
    24 
    25 
    26 
    27 @register.inclusion_tag("web/menu.html")
    28 def get_menu_style():
    29     menu_list=[123,666,999]
    30     return {"menu_list":menu_list}
    cal
    1     {% load web %}
    2     {{ n|mul:12 }}
    3     {{ val|lower }}
    4 
    5     {{ "点我"|tag }}
    6     {% mul_tag 2 3 4 %}
    7     {% get_menu_style %}
    页面上渲染

    都是通过强大的render显示的

    上边的菜单用到@register.inclusion_tag("menu.html")直接返回的页面{%%}

    @register.filter 最大两个变量{{  |   }}
    @register.simple_tag  没有限制{%%}


  • 相关阅读:
    LVS NAT模式
    lvs部署-DR模式
    Lvs原理
    iOS判断UIScrollView的滚动方向
    Swift开发必备技巧:内存管理、weak和unowned
    Swift2.0异常处理
    Swift中的延迟加载(懒加载)
    Swift和OC混编时, 关于@objc的作用
    Swift函数的定义建议
    Swift隐式可选型简单介绍
  • 原文地址:https://www.cnblogs.com/zhangqing979797/p/9962680.html
Copyright © 2011-2022 走看看