Django - 如何在基本模板中动态生成菜单

时间:2018-05-28 15:26:37

标签: django

我想从数据库中动态生成菜单,并将此菜单分成模板base.html。我在home的view.py中动态生成菜单Html,然后将此html输出到base.html。但是,我只能在访问主页时显示菜单,但不能在我跳转到另一页时显示。如何在每页上显示菜单?

主/ view.py

    def dashboard(request):
        """
        :param request:
        :return:
        """
        if 'user_id' not in request.session:
            return HttpResponseRedirect('login')

        menus = load_nav(request)
        context = {'menus': menus, 'username': request.session.get('user_name')}
        return render(request, 'home/index.html', context)

     def load_nav(request):
        """
        :param request:
        :return: 
        """
        current_user = User.objects.get(id=request.session.get('user_id'))
        if current_user is None:
            return render(request, './unauthorized.html')
        try:
            current_user_role = current_user.role.all()[:1].get()
        except User.DoesNotExist:
            return render(request, './unauthorized.html', {'message': 'No Auth.'})

        menus = current_user_role.nav.filter(parent=None).all()
        sub_menus = current_user_role.nav.exclude(parent__isnull=True).all()

        menu_html = ''
        if menus is None:
            menu_html += '<li><a href="javascript:void(0);">Index</a>'
        else:
            for menu in menus:
                if not menu.hasChildNav():
                    menu_html += '<li><a href="{url}" target="{target}"><i class="icon {icon}"></i><span>{name}</span></a>'
                else:
                    menu_html += '<li class="submenu"><a href="#" target="{target}"><i class="icon {icon}"></i><span>{name}</span></a>'
                    menu_html += '<ul style="display: none;">'
                    menu_html += load_sub_nav(menu.id, sub_menus)
                    menu_html += '</ul>'
                menu_html = menu_html.format(url=menu.url, icon=menu.icon, target=menu.target, name=menu.name)
        return format_html(menu_html)


    def load_sub_nav(parent_id, menu):
        """
        :param parent_id: 
        :param menu: 
        :return: 
        """
        sub_menu_html = ''
        sub_menus = menu.filter(parent=parent_id).all()
        if sub_menus is not None:
            for sub_menu in sub_menus:
                if not sub_menu.hasChildNav():
                    sub_menu_html += '<li><a href="{url}" target="{target}"><i class="icon {icon}" style="padding-left: 15px;"></i>' \
                                     '<span style="padding-left: 10px;">{name}</span></a></li>'
                else:
                    sub_menu_html += '<li clas="submenu"><a href="#" target="{target}"><i class="icon {icon}" style="padding-left: 15px;"></i>' \
                                     '<span style="padding-left: 10px;">{name}</span></a></li>'
                    sub_menu_html += '<ul>'
                    sub_menu_html += load_sub_nav(sub_menu.parent, sub_menus)
                    sub_menu_html += '</ul>'
                sub_menu_html = sub_menu_html.format(url=sub_menu.url, icon=sub_menu.icon, target=sub_menu.target, name=sub_menu.name)
        return format_html(sub_menu_html)

****base.html:****
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>{% block title %}{% endblock %}</title>
        {% block css %}{% endblock %}
    </head>
    <body>
        <!--sidebar-menu-->
        <div id="sidebar">
            <ul>
                {% block navbar %}

                    {{ menus }}

                {% endblock %}
            </ul>
            <!--sidebar-menu-->
        </div>
    </body>
    </html>

1 个答案:

答案 0 :(得分:0)

您需要在其他模板中包含基本模板。理想情况下,您将此行作为index.html文件中的第一行:

 {% extends 'base.html' %}