Django+zTree构建组织架构树的方法


Posted in Python onAugust 21, 2019

树,因其清晰明了的展现形式而被广泛的使用

日常的开发过程中我们需要经常与“树”打交道,例如公司的组织架构树、服务器的项目归属树,管理后台侧边树等等,本篇文章介绍关于树的两个内容

  • 多功能的前端树插件zTree
  • Django中关于树的model设计

zTree

zTree是一个开源的依靠JQuery实现的多功能树插件,具有性能优异、配置灵活、功能强大的特点

之前的系列前端插件文章已经多次介绍过将前端插件引入自己项目中的方法,这里就不赘述了,如有问题也可以参考文章末尾给出的Demo代码,在引入JS/CSS之后只需要如下代码即可构建一颗树

<ul id="treeDemo" class="ztree"></ul>
<script>
 var setting = {
 data: {
 simpleData: {
  enable: true
 }
 }
 };
 var zNodes = [
 {id: 1, pId: 0, name: "OPS-COFFEE ", open: true},
 {id: 2, pId: 1, name: "运营部", open: true},
 {id: 3, pId: 1, name: "市场部", open: true},
 {id: 4, pId: 1, name: "综合部", open: true},
 {id: 5, pId: 2, name: "产品部", open: true},
 {id: 6, pId: 2, name: "技术部", open: true},
 {id: 7, pId: 3, name: "销售部", open: true},
 {id: 8, pId: 4, name: "人事部", open: true},
 {id: 9, pId: 4, name: "财务部", open: true},
 ];
 $.fn.zTree.init($("#treeDemo"), setting, zNodes);
</script>

$.fn.zTree.init 初始化树,这里需要三个参数,第一个参数是加载树结构的Jquery对象, setting 为ztree的各种配置参数, zNodes 为ztree的具体数据

zTree的配置采用json的格式,按照配置类型分为了界面配置 view ,数据配置 data ,编辑配置 edit ,复选框配置 check ,异步加载配置 async 以及各种回调函数配置 callback ,配置丰富且强大

zTree支持两种数据模式,简单数据模式和标准数据模式,简单数据模式就像我们上边例子中这样的数据结构,而标准数据模式就需要将数据构造成复杂的JSON嵌套格式,像下边这样

var zNodes = [{
 "name": "OPS-COFFEE",
 "open": true,
 "children": [
 {
  "name": "运营部",
  "open": true,
  "children": [
  {"name": "产品部","open": true},
  {"name": "技术部","open": true}
  ]
 },
 {
  "name": "市场部",
  "open": true,
  "children": [
  {"name": "销售部","open": true}
  ]
 },
 {
  "name": "综合部",
  "open": true,
  "children": [
  {"name": "人事部","open": true},
  {"name": "财务部","open": true}
  ]
 }
 ]
}];

标准模式数据结构复杂但父子关系清晰,简单模式数据则相反,示例中我们使用了简单数据模式,需要配置simpleData的 enable 属性为true

完成以上配置后可以看到页面效果如下

Django+zTree构建组织架构树的方法 

Django

既然前端页面已经能够正常展示树了,后端就只需要返回前端对应的数据格式即可,Django中最简单的方式就是使用Foreignkey的自关联,模型设计如下:

class Department(models.Model):
    name = models.CharField(
        max_length=128, unique=True, verbose_name='名称')
    parent = models.ForeignKey(
        'self', on_delete=models.PROTECT, db_constraint=False,
        null=True, blank=True, verbose_name='父部门')

ForeignKey第一个参数用 self 就表示自关联,自己关联自己,还有两个Foreignkey的重要参数解释如下:

on_delete:控制当外键引用的对象被删除时指定的SQL约束行为

  • CASCADE:级联删除,当你删除数据时与之关联的也会删除
  • PROTECT:保护模式,当你删除数据时会抛出 ProtectedError 的错误
  • SET_NULL:设置为空,当你删除数据时外键字段被设置为空,前提是有设置 null=True, blank=True
  • SET_DEFAULT:设置默认值,当你删除数据时外键字段设置为默认值,前提是有设置 default 值
  • DO_NOTHING:什么也不做,但这可能会导致你在调用数据时报错

SET:设置一个指定的自定义实例,官方案例如下

from django.conf import settings
from django.contrib.auth import get_user_model
from django.db import models
def get_sentinel_user():
 return get_user_model().objects.get_or_create(username='deleted')[0]
class MyModel(models.Model):
 user = models.ForeignKey(
 settings.AUTH_USER_MODEL,
 on_delete=models.SET(get_sentinel_user),
 )

这个案例的意思是当删除外键字段user有关联时调用 get_sentinel_user 方法,这个方法会返回一个username为deleted的实例

db_constraint:控制是否在数据库中为此外键创建约束,默认为True。在数据库中创建外键约束是 数据库规范中明令禁止 的行为,那么我们可以设置 db_constraint 为 False 从而不在数据库层面创建约束,但同样可以使用Django为Foreignkey提供的各种关联查询

接下来可以通过如下代码将数据库中的数据转成ztree所能使用的简单模式数据并返回

def tree(request):
 mList = Department.objects.all()
 _data = [
 {
  'id': x.id,
  'name': x.name,
  'pId': x.parent.id if x.parent else 0, 'open': 1
 } for x in mList
 ]
 return render(request, 'tree.html', {'data': _data})

注意在前端使用时需要用 {{data|safe}} 的方式,添加 |safe 主要是因为Django为了安全默认会对HTML、JS等语法标签进行转义,但我们所传给前端的数据不希望转义可以通过添加 |safe 来实现

完整Demo

文章源码已上传至Github,除了以上基础代码外还包含下拉框加载树等功能,

源码地址如下:https://github.com/ops-coffee/demo/tree/master/tree

Django+zTree构建组织架构树的方法 

总结

以上所述是小编给大家介绍的Django+zTree构建组织架构树的方法,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的!

Python 相关文章推荐
windows下python模拟鼠标点击和键盘输示例
Feb 28 Python
对Python新手编程过程中如何规避一些常见问题的建议
Apr 01 Python
python类继承用法实例分析
May 27 Python
在Django的模板中使用认证数据的方法
Jul 23 Python
python代码 if not x: 和 if x is not None: 和 if not x is None:使用介绍
Sep 21 Python
python使用itchat库实现微信机器人(好友聊天、群聊天)
Jan 04 Python
Python温度转换实例分析
Jan 17 Python
使用pandas读取csv文件的指定列方法
Apr 21 Python
Python使用APScheduler实现定时任务过程解析
Sep 11 Python
python图形开发GUI库pyqt5的基本使用方法详解
Feb 14 Python
Anaconda+vscode+pytorch环境搭建过程详解
May 25 Python
Pandas中两个dataframe的交集和差集的示例代码
Dec 13 Python
python的移位操作实现详解
Aug 21 #Python
基于Python的微信机器人开发 微信登录和获取好友列表实现解析
Aug 21 #Python
Python+OpenCv制作证件图片生成器的操作方法
Aug 21 #Python
Python数据可视化实现正态分布(高斯分布)
Aug 21 #Python
django自带serializers序列化返回指定字段的方法
Aug 21 #Python
应用OpenCV和Python进行SIFT算法的实现详解
Aug 21 #Python
Python Django 添加首页尾页上一页下一页代码实例
Aug 21 #Python
You might like
php 调用远程url的六种方法小结
2009/11/02 PHP
仿AS3实现PHP 事件机制实现代码
2011/01/27 PHP
thinkphp5.1框架模板布局与模板继承用法分析
2019/07/19 PHP
阿里对象存储OSS在laravel框架中的使用方法
2019/10/13 PHP
JQuery 学习笔记 选择器之四
2009/07/23 Javascript
jQuery与ExtJS之选择实例分析
2010/08/19 Javascript
JQuery扩展插件Validate 2通过参数设置验证规则
2011/09/05 Javascript
laytpl 精致巧妙的JavaScript模板引擎
2014/08/29 Javascript
JQUERY表单暂存功能插件分享
2016/02/23 Javascript
javascript的函数劫持浅析
2016/09/26 Javascript
微信小程序  网络请求API详解
2016/10/25 Javascript
js Canvas实现的日历时钟案例分享
2016/12/25 Javascript
Angularjs+bootstrap+table多选(全选)支持单击行选中实现编辑、删除功能
2017/03/27 Javascript
JS HTML图片显示Canvas 压缩功能
2017/07/21 Javascript
vue移动端实现红包雨效果
2020/06/23 Javascript
用js实现放大镜效果
2020/10/28 Javascript
[49:21]TNC vs VG 2019DOTA2国际邀请赛淘汰赛 胜者组赛BO3 第三场 8.20.mp4
2019/08/22 DOTA
[01:42:49]DOTA2-DPC中国联赛 正赛 iG vs PSG.LGD BO3 第一场 2月26日
2021/03/11 DOTA
Pyramid将models.py文件的内容分布到多个文件的方法
2013/11/27 Python
Python multiprocessing.Manager介绍和实例(进程间共享数据)
2014/11/21 Python
Python使用functools实现注解同步方法
2018/02/06 Python
Python字符串逆序输出的实例讲解
2019/02/16 Python
python matplotlib画盒图、子图解决坐标轴标签重叠的问题
2020/01/19 Python
Pytorch十九种损失函数的使用详解
2020/04/29 Python
Python基于tkinter canvas实现图片裁剪功能
2020/11/05 Python
使用django自带的user做外键的方法
2020/11/30 Python
CSS3 mask 遮罩的具体使用方法
2017/11/03 HTML / CSS
Onzie官网:美国时尚瑜伽品牌
2019/08/21 全球购物
说说你所熟悉或听说过的j2ee中的几种常用模式?及对设计模式的一些看法
2012/05/24 面试题
大学校园毕业自我鉴定
2014/01/15 职场文书
2014党员民主评议个人总结
2014/09/10 职场文书
出纳试用期自我鉴定范文
2014/09/16 职场文书
先进党员事迹材料
2014/12/24 职场文书
院系推荐意见
2015/06/05 职场文书
教师教育心得体会
2016/01/19 职场文书
选对餐饮营销策略,营业额才会上涨
2019/08/27 职场文书