Ist die Jinja2 Templating Sprache haben das Konzept der ‚hier‘ (aktuelles Verzeichnis)?
Frage
Does Jinja2 Unterstützung schablonen relative Pfade z.B. %(here)s/other/template.html
, um andere Vorlagen in Bezug auf die aktuellen Vorlage Platz im Dateisystem?
Lösung
Ich glaube nicht. Typischerweise schließen Sie oder andere Vorlagen erweitern, indem sich ihre Wege in Bezug auf die Wurzel jeglicher Vorlage loader Angabe und Umgebung Sie verwenden.
Lassen Sie uns also sagen, dass Ihre Vorlagen alle in /path/to/templates
sind und Sie haben Jinja aufgebaut wie folgt:
import jinja2
template_dir = '/path/to/templates'
loader = jinja2.FileSystemLoader(template_dir)
environment = jinja2.Environment(loader=loader)
Wenn Sie nun /path/to/templates/includes/sidebar.html
in der /path/to/templates/index.html
Vorlage aufgenommen werden möchten, sollten Sie die folgenden in Ihrem index.html
schreiben:
{% include 'includes/sidebar.html' %}
und Jinja würde herausfinden, wie es zu finden.
Andere Tipps
Gerade in dem Will McCutchen Antwort,
Sie können mehrere Verzeichnisse in Ihrem Lader haben. Es sucht dann in jedem der Verzeichnisse (in der Reihenfolge), bis sie die Vorlage finden.
zum Beispiel, wenn man will „seitenleiste.html“ haben, statt „/includes/sidebar.html“ dann hat:
loader=jinja2.FileSystemLoader(
[os.path.join(os.path.dirname(__file__),"templates/includes"),
os.path.join(os.path.dirname(__file__),"templates")])
statt
loader=jinja2.FileSystemLoader(os.path.join(os.path.dirname(__file__),"templates"))
Nach der Dokumentation für jinja2.Environment.join_path () , Unterstützung für eine relative Vorlage Pfad ist durch join_path Überschreiben () „template Pfad verbindet“ zu implementieren.
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)
Der sauberste Weg, um diese Einschränkung zu überwinden, würde mit einer jinja2 Erweiterung sein, den Import relativ Vorlagennamen erlauben
Etwas in Größen wie:
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