Как создать динамическое меню в базовом шаблоне с помощью django

#django #django-templates #renderpartial

#django #django-шаблоны #renderpartial

Вопрос:

Я собираюсь начать новый проект, и я думаю, что на этот раз django — это правильный путь. Я читал документацию в течение последних двух недель, и это выглядит многообещающе.

Хорошо, дело в том, что я ничего не смог найти о частичном рендеринге (вызываемом на C # MVC). Например, если мне нужно динамическое меню, в котором элементы меню поступают из базы данных, то я бы ожидал, что базовый шаблон (или главная страница) отображает меню при каждом запросе (средство частичной визуализации вызывает другое действие или отображает шаблон с некоторыми данными сеанса). Итак, меню предоставляется бесплатно, если мой шаблон наследуется от этого базового шаблона.

Честно говоря, я понятия не имею, как этого добиться.


Мне бы хотелось, чтобы в базовом шаблоне был некоторый код, который использует данные, которые не содержатся в дочернем шаблоне. Я не хочу включать дополнительную переменную (возможно, ‘menu_list_items’) каждый раз, когда я вызываю render_to_response(‘child_content.html ‘,контекст). Возможно ли это?

Спасибо!

Ответ №1:

Вы можете использовать либо контекстный процессор, либо пользовательский тег шаблона для обеспечения этой функциональности.

context_processor — это простая функция, которая может добавлять объекты к каждому RequestContext. Пользовательский тег шаблона может иметь свой собственный фрагмент шаблона и контекст, который может отображать меню для вас.

Ответ №2:

Для повторного использования шаблона: вы должны просто создать базовый шаблон для общего макета и использовать подробные шаблоны для отдельных страниц. Это уже подробно описано в документации Django.

Что я обычно делаю для этих общих частей (скажем, например, меню, выделяющее текущую часть сайта, на котором используется), так это создавать свои собственные render_to_response функции, похожие на следующие:

 from django.shortcuts import render_to_response as django_render_to_response
def render_to_response(template, params, context_instance):
    return django_render_to_response(template,
                        AppendStandardParams(request, params),
                        context_instance)
  

Затем ApplyStandardParams метод настраивает меню на основе текущего пути:

 def AppendStandardParams(request, params):
    if request.META['PATH_INFO'].startswith('/customer'):
        params['category'] = 'customer'
        params['title'] = 'Customer overview'
    # and so on for all different parts
  

Эти category и title теги в этом примере представляют собой некоторые значения, используемые для выделения меню, настройки заголовков и так далее. Например:

 <!-- Customer menu entry: change class if this is the current category. -->
<li{% if category == "customer" %} class="selected"{% endif %}>Customers</li>
  

Наконец, чтобы использовать его в представлении вместо обычного render_to_response импорта, я просто делаю что-то вроде from lib.views import * , что делает мою пользовательскую версию доступной в представлении. Таким образом, синтаксис всего кода в представлениях остается неизменным, но мне не нужно настраивать меню каждый раз, когда я создаю новое представление или приложение.