我需要在我的django管理员中创建一个应该出现在所有页面中的侧边菜单。理想情况下,我的模板应该是包含此代码和解析app_list参数的通用navigation.html文件(与填充仪表板的index.html模板中使用的相同):
{% block side_menu %}
{% if app_list %}
{% for app in app_list %}
<ul class="sidebar-menu app-{{ app.app_label }} module">
<li class="treeview">
<a href="#">
<i class="fa fa-dashboard"></i> <span>{{ app.name | truncatechars:"25" }}</span>
<span class="pull-right-container">
<i class="fa fa-angle-left pull-right"></i>
</span>
</a>
{% for model in app.models %}
<ul class="treeview-menu">
{% if model.admin_url %}
<li><a href="{{ model.admin_url }}"><strong>{{ model.name }}</strong></a></li>
{% else %}
<li>{{ model.name }}</li>
{% endif %}
{% if model.add_url %}
<li><a href="{{ model.add_url }}"><i class="fa fa-plus"></i> {% trans 'Add' %}</a></li>
{% else %}
<td> </td>
{% endif %}
{% if model.admin_url %}
<li><a href="{{ model.admin_url }}"><i class="fa fa-pencil-square-o"></i> {% trans 'Change' %}</a></li>
{% else %}
<td> </td>
{% endif %}
</ul>
{% endfor %}
</li>
</ul>
{% endfor %}
{% else %}
<p>{% trans "You don't have permission to edit anything." %}</p>
{% endif %}
{% endblock side_menu %}
我的问题是:
1)如何在所有页面中包含新的navigations.html模板?
2)如何将app_list字典传递给此模板?
提前完成
答案 0 :(得分:1)
1)看起来像you're on the right track - 你有{% block %}
。您只需要让其他文件扩展该导航文件(您可能只想将其设为base.html,如链接中的文档,并使其包含所有页面应具有的所有内容)并允许这些页面添加自己的内容
这样navigations.html
允许身体:
<html>
{% block side_menu %}
...
{% endblock side_menu %}
<body>
{% block body %}
{% endblock body %}
</body>
</html>
然后在每个模板的顶部:
{% extends 'my_app/navigations.html' %}
在{% block body %}
。
2)您可以make a template context processor将上下文传递给每个模板。根据文档,它们非常简单:
这是一个Python函数,它接受一个参数,一个HttpRequest对象, 并返回一个添加到模板上下文的字典
所以:
def my_context_processor(request):
apps = App.objects.all()
return {'app_list': apps}
并在您的设置中:
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
# Other context processors....
'my_app.processors.my_context_processor',
],
},
},
]
现在,在每个模板中,您都可以执行{% for app in app_list %}
,而无需您的视图返回该上下文。