Python 导航栏中的Django动态菜单
我想创建动态菜单,意思是从表中加载菜单 这是我的django管理面板中的菜单设置 下面是我如何创建或设置菜单 这就是目前的结果Python 导航栏中的Django动态菜单,python,django,recursion,bootstrap-4,drop-down-menu,Python,Django,Recursion,Bootstrap 4,Drop Down Menu,我想创建动态菜单,意思是从表中加载菜单 这是我的django管理面板中的菜单设置 下面是我如何创建或设置菜单 这就是目前的结果 def进程请求(self,request): html_菜单=“” menus=menu.menu.objects.order\u by('order\u number')。all() 使用的\u id=[] 对于菜单中的m: 打印(“>>>”,m,m.children\u menu.all()) 如果m.target_url==''或m.target_url为N
def进程请求(self,request):
html_菜单=“”
menus=menu.menu.objects.order\u by('order\u number')。all()
使用的\u id=[]
对于菜单中的m:
打印(“>>>”,m,m.children\u menu.all())
如果m.target_url==''或m.target_url为None或m.target_url=='#':
菜单链接='#'
其他:
菜单链接=反向(m.target\u url)
children=m.children\u menu.all()
如果len(儿童)>0:
children\u id,children\u html\u menu=self.recursive\u menu(m,children)
html\u菜单+=子菜单html\u菜单
已用\u ID+=子\u ID
elif m.is_分割器:
html_菜单+=f''
{m.title}
'''
elif m.id不在已用\u id中:
html_菜单+=f''
'''
使用的\u id.append(m.id)
打印(html_菜单)
request.menus=html\u菜单
def递归菜单(self、m、children):
打印(“测试”,m,儿童)
儿童_id=[]
html_菜单=f''
'''
如果len(儿童)<1:
返回子菜单ID,html菜单
其他:
对于儿童中的c:
#打印(c,“>>>>>…”,c.儿童菜单)
子项id追加(c.id)
如果c.target_url==''或c.target_url为None或c.target_url=='#':
菜单链接='#'
其他:
菜单链接=反向(c.target\uURL)
如果len(c.children\u menu.all())>0:
child\u id,children\u html\u menu=self.recursive\u menu(c,c.children\u menu.all())
html\u菜单+=子菜单html\u菜单
子项ID+=子项ID
其他:
html_菜单+=f''
'''
html_菜单+='''
'''
返回子菜单ID,html菜单
我不仅要创造,
A,B
但是能够处理
某物:A:A1,A2,B,C:C1,…C7等等
非常感谢您的帮助,非常感谢
我打开来改变菜单的概念(模式/关系),关于现有的代码,我知道有一些地方我可以改进,我需要你的建议
def process_request(self, request):
html_menu = ''
menus = menu.Menu.objects.order_by('order_number').all()
used_ids = []
for m in menus:
print(">>>>>> " , m, m.children_menu.all())
if m.target_url == '' or m.target_url is None or m.target_url == '#':
menu_link = '#'
else:
menu_link = reverse(m.target_url)
children = m.children_menu.all()
if len(children) > 0:
children_ids, children_html_menu = self.recursive_menu(m, children)
html_menu += children_html_menu
used_ids += children_ids
elif m.is_divider:
html_menu += f'''
<hr class="sidebar-divider">
<div class="sidebar-heading">
{m.title}
</div>
'''
elif m.id not in used_ids:
html_menu += f'''
<li class="nav-item active">
<a class="nav-link" href="{menu_link}">
<i class="{m.icon_class}"></i>
<span>{m.title}</span>
</a>
</li>
'''
used_ids.append(m.id)
print(html_menu)
request.menus = html_menu
def recursive_menu(self, m, children):
print("test " , m, children)
children_ids = []
html_menu = f'''
<li class="nav-item">
<a class="nav-link collapsed" href="#" data-toggle="collapse" data-target="#collapse{m.order_number}"
aria-expanded="true" aria-controls="collapse{m.order_number}">
<i class="{m.icon_class}"></i>
<span>{m.title}</span>
</a>
<div id="collapse{m.order_number}" class="collapse" aria-labelledby="headingUtilities" data-parent="#accordionSidebar">
<div class="bg-white py-2 collapse-inner rounded">
'''
if len(children) < 1:
return children_ids, html_menu
else:
for c in children:
# print(c, ">>>>>>>>>..", c.children_menu)
children_ids.append(c.id)
if c.target_url == '' or c.target_url is None or c.target_url == '#':
menu_link = '#'
else:
menu_link = reverse(c.target_url)
if len(c.children_menu.all()) > 0:
child_ids, children_html_menu = self.recursive_menu(c, c.children_menu.all())
html_menu += children_html_menu
children_ids += child_ids
else:
html_menu += f'''
<a class="collapse-item" href="{menu_link}">
<i class="{c.icon_class}"></i>
<span>{c.title}</span>
</a>
'''
html_menu += '''
</div>
</div>
</li>
'''
return children_ids, html_menu