#python #django
#python #django
Вопрос:
Мне нужно создать боковое меню в моем администраторе django, которое должно отображаться на всех страницах. В идеале мой шаблон должен быть универсальным navigation.html файл, содержащий этот код и анализирующий параметр app_list (тот же, который используется в 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>amp;nbsp;</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>amp;nbsp;</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?
Заранее спасибо
Ответ №1:
1) Похоже, вы на правильном пути — у вас есть {% 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) Вы можете создать обработчик контекста шаблона, который передает контекст каждому шаблону. Они очень просты, согласно документации:
Это функция 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 %}
без того, чтобы ваш view возвращал этот контекст.
Комментарии:
1. Большое вам спасибо за ваш исчерпывающий ответ, Йенс. Это было именно то, что мне было нужно!