как объединить шаблон из других обработанных шаблонов?

StackOverflow https://stackoverflow.com/questions/283300

  •  08-07-2019
  •  | 
  •  

Вопрос

У меня есть проект django pro1 с несколькими приложениями:приложение1, приложение2, приложение3 и так далее.Я хочу отобразить некоторый шаблон верхнего уровня, содержащий блоки из каждого приложения:

example_base_template.html:

[header /]
[left nav bar]{{ app1 rendered template }}[/left nav bar]
[right nav bar]{{ app2 rendered template }}[/right nav bar]
[center section]{{ app1 main functionality template }}[/center section]
[footer]{{ app3 rendered template }}{{ app4 rendered template }}[/footer]

Все эти шаблоны приложений являются динамическими и используют БД.Как это сделать наиболее правильно и элегантно?Или, может быть, вопрос в том, как подключить 4 разных представления к одному URL?

Это было полезно?

Решение

У нас была проблема, похожая на эту, и ключом к этому является передача правильных данных в контекст.Мы выделили создание данных/заполнение контекста для каждого представления в отдельную процедуру построения контекста.Исходные представления просто вызывают соответствующую процедуру, а затем отображают свой шаблон.Составное представление вызывает каждый из построителей контекста, а затем отображает главный шаблон, который затем включает в себя подшаблоны.

Здесь мы столкнулись с небольшой проблемой с системой шаблонов Django.Мы кэшировали фрагменты шаблонов, и некоторые из этих фрагментов брали данные, генерация которых была очень дорогой.Если фрагмент не был устаревшим, нам точно не хотелось выполнять работу.Но откладывание работы до тех пор, пока мы не поняли, что она нам нужна, означало, что теперь мы находимся в шаблоне и:

  • Вы не можете передавать параметры методам из шаблона.
  • Метод django.template.__init__.Variable._resolve_lookup() был сломан: если вы передадите вызываемый объект, он не вызовет его!Если вы ссылаетесь на метод объекта в контексте, это работает нормально.

Причина необходимости в том, чтобы вызываемые объекты работали, заключается в том, что они позволяют вам передавать каррированную функцию, т.е.функция, у которой уже указаны некоторые (или все) параметры, но который еще не был вызван. Таким образом, представление (или сборка контекста в данном случае) должно иметь возможность каррировать полностью определенную функцию (помните, вы не можете передавать параметры в самих шаблонах), чтобы шаблон когда это было необходимо мог бы вызвать вызываемый объект, получить данные, и понеслось.

Мы использовали два отдельных подхода к этому:

  • Мы использовали Тег шаблона expr с сайта djangosnippets.org
  • Мы взломали код шаблона django, чтобы заставить работать вызываемые объекты (я использовал отправленный, но еще не обработанный патч).

С тех пор, как мы создали этот сайт, я понял, что мы могли бы решить эту проблему, используя генераторы в качестве производителей отложенных данных.Генераторы действуют как каррированная функция (в которой вы можете передавать произвольные параметры для настройки), но механизм шаблонов рассматривает их как еще один итератор.Eсть отличный урок по этому поводу.Примечание:Генераторы не являются массивами, и вы можете использовать их только один раз, поэтому некоторую часть вашей логики, возможно, придется настроить.

В следующий раз, я думаю, мы просто пойдем с шаблоны jinja2 и перестаньте возиться с шаблонами Django.

Другие советы

Вы можете использовать {% включать %} ярлык.Но это вам не сильно поможет.Лучшее решение — написать собственный тег включения с необходимым шаблоном и функционалом.

Вы не можете (проще говоря) объединить несколько представлений в одно.Попробуйте пометить это красивое решение Django.

Я сделал это, написав собственные теги шаблонов для каждого приложения, которое хотел включить.Сначала мои теги шаблона просто передавали жестко запрограммированный HTML.Позже я обнаружил, что теги могут загружать собственные фрагменты шаблонов.Где-то также был фрагмент, представляющий собой общий тег последнего контента, который работал довольно хорошо.

Многие повторно используемые приложения (особенно.отобранные в Пинакс project) служат отличным примером того, как использовать пользовательские теги шаблонов для вставки контента.Джеймс Беннетт разговаривать в DjangoCon 2008 также может помочь.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top