导航栏中的Django动态菜单

2024-04-19 03:01:55 发布

您现在位置:Python中文网/ 问答频道 /正文

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

这是我的django管理面板中的菜单设置

List of menu from my table

下面是我如何创建或设置菜单

Add menu's child

这就是目前的结果

This is the current condition

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

我不仅要创造, A,B

但是能够处理 某物:A:A1,A2,B,C:C1,…C7等等

非常感谢您的帮助,非常感谢

我打开来改变菜单的概念(模式/关系),关于现有的代码,我知道有一些地方我可以改进,我需要你的建议


Tags: dividsurltargetifhtml菜单link