¿Jinja2 admite rutas relativas a la plantilla, p. %(here)s/other/template.html
, para incluir otras plantillas relativas al lugar de la plantilla actual en el sistema de archivos?¿El lenguaje de plantillas Jinja2 tiene el concepto de 'aquí' (directorio actual)?
Respuesta
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.
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)
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"))
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
- 1. Lenguaje de plantillas JS JS
- 2. ¿Qué significa esto "-" en el motor de plantillas jinja2?
- 3. ¿Tiene una máquina de turing el concepto de 'tiempo'?
- 4. ¿Drools Fusion tiene un concepto de "ahora"?
- 5. MSBUILD: Obtienen el directorio actual de objetivos
- 6. ¿Cómo encuentro el directorio actual?
- 7. ¿Cómo obtener el directorio actual?
- 8. Servicio de Windows: obtenga el directorio actual
- 9. ¿Cómo configurar el directorio de trabajo actual?
- 10. ¿Cómo cambiar el directorio actual de SBCL?
- 11. Guardando el directorio actual en el historial de zsh
- 12. JFileChooser getCurrentDirectory devolviendo el directorio actual incorrecto?
- 13. ¿Android tiene el concepto Aspect Fill similar al iOS?
- 14. ¿Cuál es el mejor motor de plantillas Javascript actual?
- 15. ¿Cuál es el origen de '.' es decir, el directorio actual?
- 16. ¿Cuál es la mejor manera de desactivar el almacenamiento en caché de plantillas Jinja2 en bottle.py?
- 17. El concepto de Inferior en Haskell
- 18. Comprender el concepto de Inodes
- 19. ¿El lenguaje de procedimiento tiene patrones de diseño?
- 20. Obtienen el directorio actual en asp.net mvc
- 21. scp recursivo, excepto el directorio actual
- 22. Obtienen el directorio base del script actual
- 23. No se puede determinar el directorio actual
- 24. PHP Obtener el nombre del directorio actual
- 25. Obtener el directorio personal del usuario actual
- 26. Lenguaje de plantillas frente a PHP directo
- 27. Ascendiendo el Directorio de Proyectos desde Plantillas T4
- 28. Evitar los bigotes ambiguos de Jinja2 que incluyen plantillas jQuery
- 29. SWI Prolog cambiar el directorio de trabajo/obtener el directorio de trabajo actual?
- 30. Compactación de corriente CUDA: entendiendo el concepto