2011-12-14 34 views
10

Estoy intentando, en una plantilla, incluir otra que se encuentre en la misma carpeta. Para hacerlo, solo estoy haciendo {% import 'header.jinja2' %}. El problema es que sigo obteniendo un error TemplateNotFound.Cómo incluir una plantilla con una ruta relativa en Jinja2

Mi carpeta de la plantilla parece

+ myProject 
| 
+--+ templates 
    | 
    +--+ arby 
    | |-- header.jinja2 
    | |-- footer.jinja2 
    | +-- base.jinja2 
    | 
    +--+ bico 
     |-- header.jinja2 
     |-- footer.jinja2 
     +-- base.jinja2 

Así que cuando me hacen de Arby 'base.jinja2' me gustaría incluir 'Arby/header.jinja2' y cuando me hacen de bico 'base.jinja2' lo haría desea incluir 'bico/header.jinja2'. La cuestión es que no quiero escribir el prefijo 'arby /' o 'bico /' en {% include 'arby/base.jinja2'%}. es posible?

Gracias

+0

De qué archivo ¿Está ejecutando 'Por importación? – Blender

+0

desde 'arby/base.jinja2'. Me gustaría usar {% import 'header.jinja2'%} para incluir 'arby/header.jinja2' –

Respuesta

7

Hay una pista en el jinja2.Environment.join_path() docstring sobre subclases Medio Ambiente y reemplazando el método join_path() para apoyar import rutas relativas a la corriente (es decir, la padre argumento de join_path) plantilla.

Aquí es un ejemplo de tal clase:

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) 
+0

Cuidado: esto no funciona en Windows debido a los problemas de Jinja 411 y 412 - os.path.dirname y os. path.join usará ''\\'', que FilesystemLoader rechazará. Asegúrese de que el resultado esté separado con ''/'' en lugar de 'os.path.sep'. –

Cuestiones relacionadas