django: шаблон бокового меню виден везде

#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. Большое вам спасибо за ваш исчерпывающий ответ, Йенс. Это было именно то, что мне было нужно!