2010-02-01 8 views

Respuesta

34

No lo creo. Normalmente, incluye o amplía otras plantillas especificando sus rutas relativas a la raíz de cualquier cargador de plantillas y entorno que esté utilizando.

Así que digamos que las plantillas están todos en /path/to/templates y que haya configurado Jinja, así:

import jinja2 
template_dir = '/path/to/templates' 
loader = jinja2.FileSystemLoader(template_dir) 
environment = jinja2.Environment(loader=loader) 

Ahora, si desea incluir en la plantilla /path/to/templates/includes/sidebar.html/path/to/templates/index.html, que iba a escribir la siguiente en su index.html:

{% include 'includes/sidebar.html' %} 

y Jinja sería averiguar cómo llegar a ella.

6

De acuerdo con la documentación para jinja2.Environment.join_path(), es posible la compatibilidad con rutas de plantilla relativas reemplazando join_path() para implementar "unión de ruta de plantilla".

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

Sólo para añadir a la respuesta de Will McCutchen,

Es posible tener varios directorios en su cargador. Luego busca en cada uno de los directorios (en orden) hasta que encuentra la plantilla.

por ejemplo, si se quería tener "sidebar.html" en lugar de "/includes/sidebar.html" entonces:

loader=jinja2.FileSystemLoader(
     [os.path.join(os.path.dirname(__file__),"templates/includes"), 
     os.path.join(os.path.dirname(__file__),"templates")]) 

en lugar de

loader=jinja2.FileSystemLoader(os.path.join(os.path.dirname(__file__),"templates")) 
2

La forma más limpia de superar esta limitación, sería con una extensión Jinja2 que permitirá a import relative template names

Algo en la talla de:

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 
Cuestiones relacionadas