variable last jinja for comment python jinja2

python - last - ¿El lenguaje de plantillas Jinja2 tiene el concepto de ''aquí''(directorio actual)?



jinja2 python (4)

De acuerdo con la documentación de jinja2.Environment.join_path() , es posible admitir rutas de plantilla relativas al anular join_path () para implementar la "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)

¿Jinja2 admite rutas relativas a la plantilla, por ejemplo, %(here)s/other/template.html , para incluir otras plantillas relativas al lugar de la plantilla actual en el sistema de archivos?


La forma más limpia de superar esta limitación, sería con una extensión jinja2 que permita importar nombres de plantillas relativos

Algo en los gustos 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


No lo creo. Por lo general, incluye o amplía otras plantillas especificando sus rutas en relación con la raíz del cargador de plantillas y el entorno que esté utilizando.

Así que digamos que todas sus plantillas están en /path/to/templates y que ha configurado Jinja así:

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

Ahora, si desea incluir /path/to/templates/includes/sidebar.html en la plantilla /path/to/templates/index.html , escriba lo siguiente en su index.html :

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

y Jinja descubriría cómo encontrarlo.


Solo para agregar a la respuesta de Will McCutchen,

Puedes tener múltiples directorios en tu cargador. A continuación, busca en cada uno de los directorios (en orden) hasta que encuentra la plantilla.

por ejemplo, si desea tener "sidebar.html" en lugar de "/includes/sidebar.html", entonces tenga:

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"))