Ist die Jinja2 Templating Sprache haben das Konzept der ‚hier‘ (aktuelles Verzeichnis)?

StackOverflow https://stackoverflow.com/questions/2180247

  •  24-09-2019
  •  | 
  •  

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?

War es hilfreich?

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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top