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

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

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

 from rbac.models import Role

 def initial_sesson(user,request):
"""
功能:将当前登录人的所有权限录入session中
:param user: 当前登录人
"""
# 查询当前登录人的所有权限列表
# 查看当前登录人的所有角色
# ret=Role.objects.filter(user=user)
permissions = Role.objects.filter(user=user).values("permissions__url",
"permissions__is_menu",
"permissions__title",
"permissions__icon",
).distinct()
print(permissions) permission_list = []
permission_menu_list = [] for item in permissions:
# 构建权限列表
permission_list.append(item["permissions__url"]) # 构建菜单权限列表
if item["permissions__is_menu"]:
permission_menu_list.append({
"title":item["permissions__title"],
"icon":item["permissions__icon"],
"url":item["permissions__url"],
}) # 将当前登录人的权限列表注入session中
request.session["permission_list"] = permission_list
# 将当前登录人的菜单权限列表注入session中
print("permission_menu_list",permission_menu_list)
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 标签过滤器

 from django.template import Library
import re
register =Library() @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}

rbac

 <div class="static-menu">

         {% for item in permission_menu_list %}
<a href="{{ item.url }}" class="{{ item.class }}">
<span class="icon-wrap"><i class="fa {{ item.icon }}"></i></span> {{ item.title }}
</a>
{% endfor %} </div>

menu

         <div class="menu-body">

                {% load web %}
{% get_menu_styles request %} </div>

引用

其他过滤器

 from django.utils.safestring import mark_safe

 from django.template import Library
register =Library() @register.filter
def mul(x,y):
return x*y @register.filter
def tag(val): return mark_safe("<a>%s</a>"%val) @register.filter
def lower(val): return val.lower() @register.simple_tag
def mul_tag(x,y,z):
return x*y*z @register.inclusion_tag("web/menu.html")
def get_menu_style():
menu_list=[123,666,999]
return {"menu_list":menu_list}

cal

     {% load web %}
{{ n|mul:12 }}
{{ val|lower }} {{ "点我"|tag }}
{% mul_tag 2 3 4 %}
{% get_menu_style %}

页面上渲染

都是通过强大的render显示的

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

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

django 权限设置-菜单显示的更多相关文章

  1. django 权限设置

    关于权限: 首先明确权限是为了限制其他访问的url 通过在models使之关联的表再通过关联表的权限来permissions的url 来检测url的访问 一. 需要三个类五张表 from django ...

  2. django 权限设置 左侧菜单点击显示,面包屑

    1.左侧菜单点击显示 就是在点击的时候保留点击的功能 方法. 1.加入新的字段,pid来判断 class Permission(models.Model): """ 权限 ...

  3. vue权限控制菜单显示的简单实现

    为了对于不同角色显示不同的菜单 思路1: 本地放一份完整的菜单数据,通过后台返回角色的菜单列表.两者对比,筛选需要显示的菜单数据绑定, 这里有个问题就是路由vue实例初始化就生成了,加载的全部,人为输 ...

  4. vue权限控制菜单显示

    对于不同角色显示不同的菜单 思路1: 本地放一份完整的菜单数据,通过后台返回角色的菜单列表两者对比,筛选需要显示的菜单数据绑定,这里有个问题就是路由vue实例初始化就生成了,加载的全部,人为输入地址是 ...

  5. django 权限设置-登录配置权限

    1.首先需要一个判断用户是否拥有这个权限的name来区分在主页上是否显示标签 在permission中加入 name=models.CharField(max_length=32, verbose_n ...

  6. django 下拉菜单显示为object的解决办法

    在创建完Django数据库结构之后,使用Django自带的强大的admin功能往数据库中添加数据,图形化界面如下: 但时候有下拉框选项(只要在model中有定义Charfield就会显示为下拉框),如 ...

  7. 手摸手,带你用vue实现后台管理权限系统及顶栏三级菜单显示

    手摸手,带你用vue实现后台管理权限系统及顶栏三级菜单显示 效果演示地址 项目demo展示 重要功能总结 权限功能的实现 权限路由思路: 根据用户登录的roles信息与路由中配置的roles信息进行比 ...

  8. Django - 权限(2)- 动态显示单级权限菜单

    一.权限组件 1.上篇随笔中,我们只是设计好了权限控制的表结构,有三个模型,五张表,两个多对多关系,并且简单实现了对用户的权限控制,我们会发现那样写有一个问题,就是权限控制写死在了项目中,并且没有实现 ...

  9. django权限之二级菜单

    遗漏知识点 1.构建表结构时,谁被关联谁就是主表,在层级删除的时候,删除子表的时候,主表不会被删除,反之删除主表的话,字表也会被删除, 使用related_name=None   反向查询,起名用的 ...

随机推荐

  1. Codeforces Round 584 题解

    -- A,B 先秒切,C 是个毒瘤细节题,浪费了很多时间后终于过了. D 本来是个 sb 题,然而还是想了很久,不过幸好没什么大事. E1,看了一会就会了,然而被细节坑死,好久才过. 感觉 E2 很可 ...

  2. [LeetCode] 281. Zigzag Iterator 之字形迭代器

    Given two 1d vectors, implement an iterator to return their elements alternately. Example: Input: v1 ...

  3. Spring容器与SpringMVC容器的区别与联系

    在spring整体框架的核心概念中,容器的核心思想是管理Bean的整个生命周期.但在一个项目中,Spring容器往往不止一个,最常见的场景就是在一个项目中引入Spring和SpringMVC这两个框架 ...

  4. Elasticsearch由浅入深(二)ES基础分布式架构、横向扩容、容错机制

    Elasticsearch的基础分布式架构 Elasticsearch对复杂分布式机制的透明隐藏特性 Elasticsearch是一套分布式系统,分布式是为了应对大数据量. Elasticsearch ...

  5. fiddler抓包-4-简单对数据进行mock

    前言 Fiddler中有一个 AutoRespinder 选项,我们可以用它作为mock数据,可以修改它的参数等等.所有信息的返回,与我们断点类似,但这里也可以mock状态码直接是404或者跳转至另一 ...

  6. fiddler抓包-1-安装与快速上手

    前言 fiddler作为一个中间商协议代理,众所周知,有请求就会有响应,那没有响应呢?那就是哪个环节出现问题了.通过代理就可以查看到所有请求信息.与响应信息.举个例子,以前上学时有没有写过情书?或者给 ...

  7. OpenShift下的JVM监控

    去年写过一篇基于jmx监控的文章,这次在Openshift上实现,发现确实不少变化.主要重点问题在 1. prometheus jmx exporter的改进,不再需要运行一个独立的进程,不需要把数据 ...

  8. 四、Hexo静态博客绑定域名及域名解析

    示例: http://zsy.xyz/ 域名准备 ​ 购买域名及实名认证不再赘述,可通过阿里云.腾讯云等平台自行购买域名. 域名解析 进入解析界面 添加记录 选择主机记录,根据提示自行选择 记录类型选 ...

  9. 使用kibana给不同的用户创建不同的space

    Elastic安全机制 在很多的情况下,出于安全的原因,我们需要对不同的Kibana用户分配不同的用户权限,这样使得他们之间不能互相访问彼此的资源,同 时他们也应该对不同的索引拥有不同的权限,比如读, ...

  10. WPF布局原则

    WPF系统使用基于流布局的布局标准,开发人员创建与显示分辨率和窗口大小无关的用户界面.在不同显示器上可以进行很好的缩放. 首先来谈一谈布局原则: WPF窗口只能包含一个元素(Window元素属于内容控 ...