Django权限之树形菜单权限构建

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Django权限之树形菜单权限构建菜单权限
左侧栏展⽰⽤户拥有的权限
1, 重构stark组件 ,加上title和左侧栏
创建base.html,静态⽂件
{%block css%}
盒⼦,继承的页⾯要继承这个模板,他有⾃⼰的CSS,为了扩充css⽤的
{%endblock%}
2,更改编辑和删除按钮的图标
图标⽹址: font awespme 这个⽹站的图标⽐较丰富
copy到⾃⼰的stark-->sites.py , 也要引这个插件才能⽤
list_view.html 要继承 base.html
两个盒⼦
3, 做添加页⾯
add_view.html 继承 base.html
编辑和删除页⾯同上操作 .
4, base.html---> {% side_bar %} 左边栏
构建左侧权限标签(动态构建, "路径","⽂本")
注意!!
动态参数的不能做菜单权限,能做菜单权限的只有查看
查看客户和查看订单注意两个⽅⾯: 1, ⽂本要展⽰出来, 2,过滤出来真正的菜单权限,
之前在permissions.py录⼊的数据,有url,没有title,就没办法做⽂本了,不要⽤这个列表,⽤字典.
更改:
在去base.html
再去登录页⾯前要去改 middlewares.py中间件,
登录页⾯后,页⾯是这样的
出现了8个,但我们只要两个; 进⾏过滤,
定义: 查看订单和查看客户为菜单权限,其他为按钮权限 重新设计Permission表字段
数据迁移>>>>> 查看更改数据库
再回到 permissions.py 进⾏筛选 , 添加 :
再去stark组件 >>> sites.py>>> list_view视图中,进⾏判断筛选
 然后在 base.html 中 side_bar 循环 menu_list :
重新进⾏登录和查看
\
现在出现了⼀个恶⼼的事,刚刚的操作动了stark >>> sites 的源码.
后果是菜单权限只有在 list_view 视图中才会显⽰,每个视图都写⼀份也能实现, 但代码重复,也不能动源码.这个⽤⾃定义标签过滤器⽅法 :
在 rbac >>> 建⼀个templatetags >>> rbac.py (写⾃定义模板)
在 rbac >>> 建⼀个templates >>> menu.html (menu 模板)
构建⾃定义I标签:
以上在 list_view 视图中写的函数写在 templatetags >>> rbac.py 中 ,因为这是跟权限相关的
 语法 : @register.inclusion_tag() 括号⾥放样式,传给谁⽤的
流程 : templatetags >>> rbac.py(构建数据) 传给 templates >>> menu.html(渲染出来两个a 'or' p标签)
最终到 base.html *这样数据 , 样式就都在rbac 中了 , 耦合性好
最后 ,按照加载应⽤从上到下的顺序,为了避免 menu.html 被上边的应⽤重复后覆盖,在
templates >>> 建 rbac的包, 在把 menu.html 放进去.
templatetags >>> rbac.py(构建数据)
from django import template
from ..models import Permission
register = template.Library()
@register.inclusion_tag("rbac/menu.html")
def get_menu(request):
print("OK...")
permission_list = request.session.get("permission_list")
menu_list = []
for per in permission_list:
if per.get("type") == "menu":
menu_list.append(per)
default_data=[
{
"text": '信息管理',
"href": '',
"tags": ['2'],
"nodes": [
{
"text": '客户管理',
"href": '',
"tags": ['1'],
"nodes": [
{
"text": '查看客户',
"href": '/stark/app01/customer/',
"tags": ['0']
},
]
},
{
"text": '订单管理',
"href": '',
"tags": ['1'],
"nodes": [
{
"text": '查看订单',
"href": '/stark/app01/order/',
"tags": ['0']
},
]
},
]
},
{
"text": '权限管理',
"href": '',
"tags": ['0']
},
]
return {"default_data": default_data}
templates >>>rbac>>>> menu.html
<div id="treeview"class="small">
</div>
<script src="/static/bootstrap-treeview/js/bootstrap-treeview.js"></script>
<script type="text/javascript">
// API⽂档参数列表: https:///tangzeqi/p/8021637.html
$(function() {
var options = { #safe:不加这个浏览器会转义
data:{{ default_data|safe }} , //data属性是必须的,是⼀个对象数组 Array of Objects.
color: "", //所有节点使⽤的默认前景⾊,这个颜⾊会被节点数据上的backColor属性覆盖. String
backColor: "#000000", //所有节点使⽤的默认背景⾊,这个颜⾊会被节点数据上的backColor属性覆盖. String
borderColor: "#000000", //边框颜⾊。

如果不想要可见的边框,则可以设置showBorder为false。

String
nodeIcon: "glyphicon glyphicon-stop", //所有节点的默认图标
checkedIcon: "glyphicon glyphicon-check", //节点被选中时显⽰的图标 String
collapseIcon: "glyphicon glyphicon-minus", //节点被折叠时显⽰的图标 String
expandIcon: "glyphicon glyphicon-plus", //节点展开时显⽰的图标 String
emptyIcon: "glyphicon", //当节点没有⼦节点的时候显⽰的图标 String
enableLinks: false, //是否将节点⽂本呈现为超链接。

前提是在每个节点基础上,必须在数据结构中提供href值。

Boolean highlightSearchResults: true, //是否⾼亮显⽰被选中的节点 Boolean
levels: 2, //设置整棵树的层级数 Integer
multiSelect: false, //是否可以同时选择多个节点 Boolean
onhoverColor: "#F5F5F5", //光标停在节点上激活的默认背景⾊ String
selectedIcon: "glyphicon glyphicon-stop", //节点被选中时显⽰的图标 String
searchResultBackColor: "", //当节点被选中时的背景⾊
searchResultColor: "", //当节点被选中时的前景⾊
selectedBackColor: "", //当节点被选中时的背景⾊
selectedColor: "#FFFFFF", //当节点被选中时的前景⾊
showBorder: true, //是否在节点周围显⽰边框
showCheckbox: false, //是否在节点上显⽰复选框
showIcon: true, //是否显⽰节点图标
showTags: false, //是否显⽰每个节点右侧的标记。

前提是这个标记必须在每个节点基础上提供数据结构中的值。

uncheckedIcon: "glyphicon glyphicon-unchecked", //未选中的复选框时显⽰的图标,可以与showCheckbox⼀起使⽤
};
$('#treeview').treeview({
color: "#4F4F4F",
expandIcon: 'glyphicon glyphicon-chevron-right',
collapseIcon: 'glyphicon glyphicon-chevron-down',
nodeIcon: 'glyphicon glyphicon-bookmark',
enableLinks: true,
levels: 1,
showIcon:false,
selectedBackColor: "",
selectedColor: "#333",
data: {{ default_data|safe }},
});
$('#treeview').on('nodeSelected',function(event, data) {
console.log(data);
})
});
</script>
base.html 获取到数据
<div class="pg-body">
<div class="left-menu">
{% block side_bar %}
{% load rbac %}
{% get_menu request %}
{% endblock side_bar %}
</div>
<div class="right-body">
{% block content %}
{% endblock content %}
</div>
</div>
补充 :
多级菜单展⽰
⼀级菜菜单没有URL ⼆级也没有 ,最后⼀级有URL, 也就是它的⽗级都没有URL
权限与权限之间建⽴⽗⼦关系 , ⾃关联的东东 , ⼀个⽗权限有多个⼦权限.⼀个⼦权限只能有⼀个⽗权限
在权限的 model 中建⽴字段
在加⼀个 blank=True 默认为空 , 数 据 迁 移
默认为True,在页⾯就可以写URL就可以不写
在 rbac >>> stark.py 中加展⽰
登录后进⼊ permissions 加点权限
查看订单改成订单管理下
下边构建树形数据结构 ,
templatetags >>> rbac.py(构建数据) ⾥
是⼀个列表,⼀个权限放在⼀个字典中
treeview5 :>> 是标签div的名字,找到这个标签
text : 标签构建的⽂本
href : 路径
tags : 有多少的⼦节点 ,就是就⼏个⼉⼦
nodes : 是它下边的⼉⼦,下边⼏个字典就⼏个⼉⼦
menu.html 就不要⾃⼰写了,⽤插件写 , 引 static 组件,
menu.html插件需要的数据,rbac提供数据( menu插件要求的 default_data 格式是:
( ⼀个列表套⼀个字典,字典⾥代表有权限的URL tags, nodes ⾥套⼏个⼉⼦ )。

相关文档
最新文档