Python 导航栏中的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

我想创建动态菜单,意思是从表中加载菜单

这是我的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为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