Python实现无限级分类

news/2024/9/23 14:23:50/

1.什么是无限级分类?

  • 顾名思义,就是一级接一级的无限制分级。其实简单点说就是一个人类可以繁衍出多个后代,然后一个后代又可以分另外多个后代这样无限繁衍下去(举例:家族族谱),就好象linux系统你可以新建一个文件夹,然后在这个文件夹里又可以建一些个文件夹,在文件夹底下还可以建一些文件夹一样,随后使用tree命令就可以查看文件夹目录层级。那么这种层级结构也成为树结构在日常的开发需求里也是很常见的,比如淘宝商城系统的商品分类,课程的目录章节,以及论坛里的帖子回复等等*

好了,话不多说,上代码(我们以工单系统为例)!!!

以下为后端代码:

首先,打开django项目中的models.py,新建一个类别的模型类,这里我们以最简单的parent_id的形式来建立(相当于自关联)
class WorkOrder(models.Model):name = models.CharField(max_length=50, verbose_name='分类名称')pid = models.IntegerField(default=0, verbose_name='父类ID')class Meta:db_table = 'workorder'def __str__(self):return self.name
因为我的项目是基于drf框架,所以需要一个序列化器:
from rest_framework.serializers import ModelSerializer
from .models import *class OrderSer(ModelSerializer):class Meta:model = WorkOrderfields = '__all__'
由于django序列化出来的类不具备层级结构,所以我们提前在views.py中写好一个用来递归的方法:
def xTree(datas):lists = []tree = {}parent_id = ''for i in datas:item = iprint(item)tree[item['id']] = itemroot = Nonefor i in datas:obj = iif not obj['pid']:root = tree[obj['id']]lists.append(root)else:parent_id = obj['pid']if 'childlist' not in tree[parent_id]:tree[parent_id]['childlist'] = []tree[parent_id]['childlist'].append(tree[obj['id']])return lists
此时我们再写一个视图接口,从数据库中读取数据就可以了
class MyTree(APIView):def get(self, request):# 获取订单列表orderlist = WorkOrder.objects.all()# 序列化orderlist_ser = OrderSer(orderlist, many=True)mylist = xTree(orderlist_ser.data)# print(mylist)return Response(mylist)
最后为咱们的视图添加路由
from userapp.views import *urlpatterns = [path('admin/', admin.site.urls),path('mytree/', MyTree.as_view()),
]

好了,以上就是我们后端的代码

然后我们向数据库添加测试数据

在这里插入图片描述

Postman测试后端接口:

在这里插入图片描述

perfect!!!

接下来我们再说说前端:

打开vue项目,封装一个WXJcate.vue递归组件
所谓递归组件: 就是组件可以在它们自己的模板中调用自身,不过它们只能通过 name 选项来做这件事,例如给组件设置属性 name: ‘WorkOrder.vue’,然后在模板中就可以使用 WorkOrder调用自己进行递归调用了
<template><div><ul><div :class="[data.id==0 ? 'root': '', 'workorder']">{{ data.name }}</div><ol v-if="data.childlist && data.childlist.length>0"><workorder v-for="child in data.childlist" :key="child.id" :data="child"/></ol></ul></div>
</template><script>export default {name: 'workorder', // 递归组件需要设置 name 属性,才能在模板中调用自己props:['data'],};
</script><style >.workorder {padding-left: 8px;border-left: 1px solid gray;}ul {padding-left: 20px;list-style: none;}.root { display: none; }</style>
然后就可以在其他页面中调用这个递归组件
在order_Index.vue调用递归组件并请求后端的数据:
<template><div><!--  添加分类数据  --><div>工单项目名称: <input type="text" v-model="name">父级分类:<select v-model="pid"><option value="0">主项目</option><option :value='order.id' v-for="order in order_list" :key="order.id">{{order.name}}</option></select><button @click="btn">添加</button></div><!--  展示分类数据  --> <div><workorder :data="data" /></div></div>
</template><script>import workorder from './workorder.vue';export default {data () {return {data:{},online: 0,order_list:[],name:'',pid:''}},components: {workorder},//钩子方法mounted:function(){this.get_data();this.get_order_list()},//绑定事件methods:{get_data(){this.$axios.get('mytree/').then((res) =>{console.log(res.data);var mytree = {'id':0,name:'123'};mytree['childlist'] = res.data;this.data = mytree;});},get_order_list(){this.$axios.get('order/').then(res=>{this.order_list = res.dataconsole.log(res.data)})},btn(){let fdata =new FormData()fdata.append('name',this.name)fdata.append('pid',this.pid)this.$axios.post('order/',fdata).then(res=>{alert('添加成功')this.$router.go(0)console.log(fdata)})}}}
</script><style>.on {background: #cdcbff;}.off {background: #fefdff;}
</style>

好了,现在咱们的前端也写好了,下面让我们看一下页面的效果吧:

在这里插入图片描述

好了,今天的分享到这里就结束了,希望这篇文章可以给大家带来帮助!!!


http://www.ppmy.cn/news/390133.html

相关文章

Python中常见的数据类型

Python基本数据类型一般分为&#xff1a;数字、字符串、列表、元组、字典、集合&#xff08;可变集合和不可变集合&#xff09;这六种基本数据类型&#xff0c; 其中 数字、字符串、元祖和可变集合为不可变类型&#xff0c;列表、字典和不可变集合为可变类型。 下面我们来详细…

以前一款半回合制java游戏_我以前玩过一款回合制游戏,很久以前的事了但是忘记叫什么名字了? 爱问知识人...

仙剑系列 仙1是我第一个玩的游戏&#xff0c;感觉很粗糙&#xff0c;不过很经典。 直到玩了第2个游戏&#xff0c;仙3&#xff0c;3D的画面让我第一次感受了到单机游戏的丰富多采&#xff0c;让我开始步入单机游戏的的殿堂。仙3外还是我继幻想三国志2后&#xff0c;第二次流下泪…

宫廷心计服务器修复,3月25日停服版本更新公告

亲爱的玩家&#xff1a; 为了丰富游戏玩法&#xff0c;改善各位玩家的游戏体验&#xff0c;《宫廷计手游》将于3月25日04:00-09:00进行全服停服版本更新&#xff0c;更新过程中将无法登入游戏。 版本更新后安卓平台需要重新下载游戏&#xff0c;请玩家提前下载最新版本。 【更新…

新天骄服务器爆率修改,天骄网游技能修改详解

关于技能修改,好多人已经知道怎么回事了 我不知道别人是怎么修改的,我来说一下我的方法 解密objmdl下的MethodMdl.ini文件 这个文件里放的是技能效果 我们要做自己的技能就要从它入手 下面我们把游侠的 斩棘披荆 改成术士的 长空冰暴 先来看看 斩棘披荆 的技能描述 wType=4 ——…

Docker部署前后端分离项目

云主机 centos7 中Docker容器式部署前后端分离项目DjangoVue.js 前期准备&#xff1a; Docker安装Docker - CentOS Docker 软件包和依赖包已经包含在默认的 CentOS-Extras 软件源里&#xff0c;安装命令如下 yum -y install docker本地安装软件FileZilla Client&#xff0c;并…

秦殇 二进制txt 异或(h2.exe相关)

最近研究点秦殇的东西 去秦殇吧看到前人研究出了h2.exe 就写个python批量修改txt 到out目录 #!/usr/bin/env python import osdef filecovert(file_path, out_dir):b bytearray(open(file_path, rb).read())isSec 1if len(b) > 0:if b[0] 128 :del b[0]isSec 0for i i…

秦殇千年轮回java游戏下载,智云稳定器如何拍旋转画面 使用稳定器拍摄画面方法...

有的朋友在买了稳定器之后&#xff0c;拍摄的时候发现画面还是不够稳定&#xff0c;然后就怀疑稳定器是不是有问题。其实不是&#xff0c;稳定器是能很好的解决移动拍摄中的抖动问题&#xff0c;但是在拍摄过程中&#xff0c;我们还是要注意一些*基本的问题。在这里带来使用智云…