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