django 权限设置-菜单显示
问题:
在用户登录后,如何只显示出用户权限的菜单呢?
需要设置显示菜单权限
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 权限设置-菜单显示的更多相关文章
- django 权限设置
关于权限: 首先明确权限是为了限制其他访问的url 通过在models使之关联的表再通过关联表的权限来permissions的url 来检测url的访问 一. 需要三个类五张表 from django ...
- django 权限设置 左侧菜单点击显示,面包屑
1.左侧菜单点击显示 就是在点击的时候保留点击的功能 方法. 1.加入新的字段,pid来判断 class Permission(models.Model): """ 权限 ...
- vue权限控制菜单显示的简单实现
为了对于不同角色显示不同的菜单 思路1: 本地放一份完整的菜单数据,通过后台返回角色的菜单列表.两者对比,筛选需要显示的菜单数据绑定, 这里有个问题就是路由vue实例初始化就生成了,加载的全部,人为输 ...
- vue权限控制菜单显示
对于不同角色显示不同的菜单 思路1: 本地放一份完整的菜单数据,通过后台返回角色的菜单列表两者对比,筛选需要显示的菜单数据绑定,这里有个问题就是路由vue实例初始化就生成了,加载的全部,人为输入地址是 ...
- django 权限设置-登录配置权限
1.首先需要一个判断用户是否拥有这个权限的name来区分在主页上是否显示标签 在permission中加入 name=models.CharField(max_length=32, verbose_n ...
- django 下拉菜单显示为object的解决办法
在创建完Django数据库结构之后,使用Django自带的强大的admin功能往数据库中添加数据,图形化界面如下: 但时候有下拉框选项(只要在model中有定义Charfield就会显示为下拉框),如 ...
- 手摸手,带你用vue实现后台管理权限系统及顶栏三级菜单显示
手摸手,带你用vue实现后台管理权限系统及顶栏三级菜单显示 效果演示地址 项目demo展示 重要功能总结 权限功能的实现 权限路由思路: 根据用户登录的roles信息与路由中配置的roles信息进行比 ...
- Django - 权限(2)- 动态显示单级权限菜单
一.权限组件 1.上篇随笔中,我们只是设计好了权限控制的表结构,有三个模型,五张表,两个多对多关系,并且简单实现了对用户的权限控制,我们会发现那样写有一个问题,就是权限控制写死在了项目中,并且没有实现 ...
- django权限之二级菜单
遗漏知识点 1.构建表结构时,谁被关联谁就是主表,在层级删除的时候,删除子表的时候,主表不会被删除,反之删除主表的话,字表也会被删除, 使用related_name=None 反向查询,起名用的 ...
随机推荐
- 2016年蓝桥别A组模拟训练
1. 网友年龄 某君新认识一网友. 当问及年龄时,他的网友说: “我的年龄是个2位数,我比儿子大27岁, 如果把我的年龄的两位数字交换位置,刚好就是我儿子的年龄” 请你计算:网友的年龄一共有多少种可能 ...
- Spring Boot 知识笔记(集成zookeeper)
一.本机搭建zookeeper伪集群 1.下载安装包,复制三份 2.每个安装包目录下面新建一个data文件夹,用于存放数据目录 3.安装包的conf目录下,修改zoo.cfg配置文件 # The nu ...
- 阅读java编程思想的总结(一)
学而不思则罔,思而不学则殆 一.对象(Object) 1.机器模型(方案空间),实际解决问题的问题模型(问题空间). 2.我们将问题空间中的元素以及它们在方案空间的表示物称为“对象”(Object). ...
- Visual Studio 调试系列6 监视变量(使用监视窗口和快速监视窗口)
系列目录 [已更新最新开发文章,点击查看详细] 当你进行调试时,可以使用 监视窗口 和 快速监视窗口 来监视变量和表达式. 仅在调试会话期间,这两个窗口才可用. 监视窗口可以在调试时一次显示多 ...
- 一文搞定所有 web 自动化常见问题
Firefox 1. Firefox路径问题 firefox火狐浏览器去完成自动化测试时,代码报了如下错误: Cannot find firefox binary in PATH. mark sure ...
- Oracle 自定义函数实现列转行效果
在 Oracle 领域,我相信一说到列转行大部分人都会立马想到 WM_CONCAT 函数,我觉得主要是因为该函数比较实用.但事实上 WM_CONCAT 并非官方公开函数,使用会存在一定的风险:函数返回 ...
- [转帖]linux lsof 用法简介
linux lsof 用法简介 https://www.cnblogs.com/saneri/p/5333333.html 1.简介: lsof(list open files)是一个列出当前系统打开 ...
- centos7.x下环境搭建(三)—nodejs安装
有3种方式可以安装nodejs yum安装 源码包安装 nvm方式安装 一.方式1:yum安装 这里我们指定安装8.x以上的版本 # curl --silent --location https:// ...
- C#获取剪切板的内容
// GetDataObject获取当前剪贴板上的数据 IDataObject data = Clipboard.GetDataObject(); // 将数据与指定的格式进行匹配,返回bool if ...
- [Silverlight 4] 參數的傳遞方法
Silverlight都會有一個專案叫 *.Web,有個ManagePage.aspx裝戴Silverlight元件,也是應用程式的入口 然後還會有一個專案(此處叫ManageBack),會編譯成Si ...