Поддерживает ли Jinja2 относительные пути шаблонов, например. %(here)s/other/template.html
, чтобы включить другие шаблоны относительно места текущего шаблона в файловой системе?Имеет ли язык шаблонов Jinja2 концепцию «здесь» (текущий каталог)?
ответ
Я так не считаю. Обычно вы включаете или расширяете другие шаблоны, указывая их пути относительно корня любого загрузчика шаблонов и среды, которую вы используете.
Так скажем, ваши шаблоны находятся в /path/to/templates
и вы создали дзиндзя так:
import jinja2
template_dir = '/path/to/templates'
loader = jinja2.FileSystemLoader(template_dir)
environment = jinja2.Environment(loader=loader)
Теперь, если вы хотите включить /path/to/templates/includes/sidebar.html
в /path/to/templates/index.html
шаблоне, вы бы написать следующее в вашем index.html
:
{% include 'includes/sidebar.html' %}
и дзиндзя бы выяснить, как найти его.
В соответствии с документацией для jinja2.Environment.join_path(), поддержка относительных путей шаблона возможна путем переопределения join_path() для реализации «объединения путей к шаблону».
class RelEnvironment(jinja2.Environment):
"""Override join_path() to enable relative template paths."""
def join_path(self, template, parent):
return os.path.join(os.path.dirname(parent), template)
Просто, чтобы добавить к ответу Уилла Маккатчен,
Вы можете иметь несколько каталогов в заряжающего. Затем он ищет в каждой из каталогов (по порядку), пока не найдет шаблон.
, например, если вы хотите иметь "sidebar.html" вместо "/includes/sidebar.html", то есть:
loader=jinja2.FileSystemLoader(
[os.path.join(os.path.dirname(__file__),"templates/includes"),
os.path.join(os.path.dirname(__file__),"templates")])
вместо
loader=jinja2.FileSystemLoader(os.path.join(os.path.dirname(__file__),"templates"))
Чистейшим способом преодолеть это ограничение, будет с расширением jinja2, что позволит import relative template names
что-то в подобных:
from jinja2.ext import Extension
import re
class RelativeInclude(Extension):
"""Allows to import relative template names"""
tags = set(['include2'])
def __init__(self, environment):
super(RelativeInclude, self).__init__(environment)
self.matcher = re.compile("\.*")
def parse(self, parser):
node = parser.parse_include()
template = node.template.as_const()
if template.startswith("."):
# determine the number of go ups
up = len(self.matcher.match(template).group())
# split the current template name into path elements
# take elements minus the number of go ups
seq = parser.name.split("/")[:-up]
# extend elements with the relative path elements
seq.extend(template.split("/")[1:])
template = "/".join(seq)
node.template.value = template
return node
- 1. Получить текущий язык в Jinja2
- 2. Есть ли способ изменить каталог загрузки шаблонов Jinja2 за запрос?
- 3. Есть ли язык шаблонов?
- 4. Tidy для шаблонов Jinja2
- 5. Шаблоны Jinja2 с использованием шаблонов шаблонов Django
- 6. Имеет ли WSDL концепцию асинхронного веб-метода?
- 7. Имеет ли javascript концепцию, подобную API
- 8. Имеет ли GCP концепцию расслоения счетов?
- 9. Имеет ли в python концепцию переменной сеанса?
- 10. Имеет ли CMake концепцию ifdef endif
- 11. Имеет ли ASP.NET MVC концепцию App_Code?
- 12. Имеет ли переменная volatile здесь (многоядерный процессор)?
- 13. Можно ли установить текущий каталог?
- 14. Поддержка шаблонов Jinja2 в Eclipse
- 15. Покрытие кода для шаблонов Jinja2
- 16. typo3 templavoila проверить текущий язык
- 17. Определить текущий язык ввода
- 18. Могу ли я избежать рекурсии шаблонов здесь?
- 19. Имеет ли процедурный язык шаблоны проектирования?
- 20. делает ли еще концепцию доступной в файле свойств (язык оргчука)?
- 21. JS SDK Текущий язык
- 22. Имеет ли Haskell концепцию «построить», такую как язык C и ML?
- 23. Имеет ли Couchbase язык запросов?
- 24. Как определить, какой язык предпочитает текущий язык
- 25. Каталог шаблонов юзабилити
- 26. Найти текущий язык пользователя
- 27. Текущий высокоуровневый язык vim
- 28. Что такое язык шаблонов?
- 29. Рендеринг форм django с движком шаблонов jinja2
- 30. Как проверить, поддерживает ли текущий каталог SVN?