Есть ли в языке шаблонов Jinja2 понятие «здесь» (текущий каталог)? - PullRequest
24 голосов
/ 02 февраля 2010

Поддерживает ли Jinja2 относительные к шаблону пути, например, %(here)s/other/template.html, чтобы включить другие шаблоны относительно места текущего шаблона в файловой системе?

Ответы [ 4 ]

36 голосов
/ 02 февраля 2010

Я так не считаю. Обычно вы включаете или расширяете другие шаблоны, указывая их пути относительно корня загрузчика шаблонов и среды, которую вы используете.

Итак, предположим, что все ваши шаблоны находятся в /path/to/templates, и вы настроили Jinja следующим образом:

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' %}

и Джинджа выяснит, как его найти.

15 голосов
/ 19 марта 2012

Просто чтобы добавить к ответу Уилла Маккатчена,

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

например, если вы хотите иметь "sidebar.html" вместо "/include/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"))
7 голосов
/ 07 сентября 2010

Согласно документации для 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)
2 голосов
/ 07 июля 2014

Самый простой способ преодолеть это ограничение - использовать расширение jinja2, которое позволит импортировать относительные имена шаблонов

Что-то вроде:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...