分级菜单的简单逻辑
个人感觉这个逻辑不错,就分享吧
分级菜单的实现其实就是一个儿子找爸爸的过程:
准备数据:
from django.test import TestCase from django.shortcuts import HttpResponse # Create your tests here. def test(request): # menu_list menu_list = { 1: {"name": "菜单1", "status": False, 'child': [], "parent_id": None}, #这是真爸爸,没有父亲的祖宗 2: {"name": "菜单2", "status": False, 'child': [], "parent_id": 1}, #这是个伪爸爸 3: {"name": "菜单3", "status": False, 'child': [], "parent_id": 2} #这也是 } # item_list item_list = [ {"name": "item1", "status": True, "parent_id": 1,"child":[]}, #儿子们 {"name": "item2", "status": True, "parent_id": 1,"child":[]}, {"name": "item3", "status": True, "parent_id": 1,"child":[]}, ] # 目的把item1,2,3,菜单2,放到menu_list 菜单一下面,菜单3放到菜单2下面 #效果如下: # 菜单1 # ---- item1 # ---- item2 # ---- item3 # ---- 菜单2 # -------- 菜单3
首先对儿子们数据重新整理,一个爸爸的分一组:
# 加工item_list:同一个爸爸站一组 son_dict = {} for item in item_list: if item["parent_id"] in son_dict: son_dict[item["parent_id"]].append(item) else: son_dict[item["parent_id"]] = [item, ] # print(son_dict)
结果:1 爸爸里面有三个儿子
{1: [{'name': 'item1', 'status': True, 'parent_id': 1, 'child': []}, {'name': 'item2', 'status': True, 'parent_id': 1, 'child': []}, {'name': 'item3', 'status': Tru
e, 'parent_id': 1, 'child': []}]}
找到爸爸:
for k,v in son_dict.items(): menu_list[k]['child']=v #上面的组放进爸爸child里面 menu_list[k]['status']=True print(menu_list)
结果:1爸爸里面child 有3个儿子
{1: {'name': '菜单1', 'status': True, 'child': [{'name': 'item1', 'status': True, 'parent_id': 1, 'child': []}, {'name': 'item2', 'status': True, 'parent_id': 1, 'c
hild': []}, {'name': 'item3', 'status': True, 'parent_id': 1, 'child': []}], 'parent_id': None}, 2: {'name': '菜单2', 'status': False, 'child': [], 'parent_id': 1},
3: {'name': '菜单3', 'status': False, 'child': [], 'parent_id': 2}}
处理伪爸爸:等级关系处理
result=[] for item in menu_list.values(): if not item['parent_id']: result.append(item) #真爸爸 else: menu_list[item["parent_id"]]['child'].append(item) #伪爸爸放进真爸爸child print(result)
结果:又多了一个儿子菜单2,这个儿子还有个儿子菜单3
[{'name': '菜单1', 'status': True, 'child': [{'name': 'item1', 'status': True, 'parent_id': 1, 'child': []}, {'name': 'item2', 'status': True, 'parent_id': 1, 'chil
d': []}, {'name': 'item3', 'status': True, 'parent_id': 1, 'child': []}, {'name': '菜单2', 'status': False, 'child': [{'name': '菜单3', 'status': False, 'child': []
, 'parent_id': 2}], 'parent_id': 1}], 'parent_id': None}]
最后打印结果:
for item in result: print(item['name']) for n in item['child']: print("----",n["name"]) for r in n["child"]: #这层为打印孙子菜单3,当然可以递归实现。。。 print("--------",r['name']) return HttpResponse("ok")
菜单1
---- item1
---- item2
---- item3
---- 菜单2
-------- 菜单3

浙公网安备 33010602011771号