Как сделать динамическое меню в базовом шаблоне с помощью django - PullRequest
0 голосов
/ 26 октября 2011

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

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

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


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

Спасибо!

Ответы [ 2 ]

6 голосов
/ 26 октября 2011

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

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

0 голосов
/ 26 октября 2011

Для повторного использования шаблона: вам нужно просто создать базовый шаблон для общего макета и использовать подробные шаблоны для отдельных страниц.Это уже подробно описано в документации 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 *, что делает мою пользовательскую версию доступной в представлении.Таким образом, синтаксис всего кода в представлениях остается неизменным, но мне не нужно настраивать меню каждый раз, когда я создаю новое представление или приложение.

...