2010-02-01 3 views

ответ

34

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

Так скажем, ваши шаблоны находятся в /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' %} 

и дзиндзя бы выяснить, как найти его.

6

В соответствии с документацией для 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) 
14

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

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

, например, если вы хотите иметь "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")) 
2

Чистейшим способом преодолеть это ограничение, будет с расширением 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 
Смежные вопросы