1. 渲染多级菜单, 并调整数据
class MenuTreeView(APIView):
def generate_menu_tree(self, parent_menu):
temp_menu_list = []
sub_menus = models.Menu.objects.filter(parent=parent_menu)
for sub_menu in sub_menus:
_temp = {'id': sub_menu.id, 'label': sub_menu.title, 'sortNo': sub_menu.sortNo, 'url': sub_menu.url,
'show': 0, 'children': self.generate_menu_tree(sub_menu)}
temp_menu_list.append(_temp)
return temp_menu_list
def process_nested(self, data, menu_id_list):
if isinstance(data, dict):
if data['id'] in menu_id_list:
data['show'] = 1
if isinstance(data['children'], (dict, list)):
self.process_nested(data['children'], menu_id_list)
elif isinstance(data, list):
for item in data:
if isinstance(item, (dict, list)):
self.process_nested(item, menu_id_list)
def update_show(self, data):
for item in data:
children = item.get('children')
if children:
self.update_show(children)
has_show_1 = any(child.get('show') == 1 for child in children)
if has_show_1:
item['show'] = 1
return data
def get(self, request):
print(request.GET)
res = []
try:
req_data = request.GET.dict()
flag = req_data.get('flag')
menu_tree = self.generate_menu_tree(None)
if flag == 'all':
_menu_id_list = models.Menu.objects.all().values_list('id', flat=True)
self.process_nested(menu_tree, _menu_id_list)
else:
_menu_id_list = []
for i in request.user.roles.all():
_menu_id_list.extend(i.menu.all().values_list('id', flat=True))
_menu_id_list = set(_menu_id_list)
self.process_nested(menu_tree, _menu_id_list)
self.update_show(menu_tree)
res = menu_tree
except:
traceback.print_exc()
return JsonError(msg='错误')
return JsonResponse(res)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)