我想从数据库中动态生成菜单,并将此菜单分成模板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>
答案 0 :(得分:0)
您需要在其他模板中包含基本模板。理想情况下,您将此行作为index.html文件中的第一行:
{% extends 'base.html' %}