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