Frage

Ich bin ein Front-End-Entwickler, und ich habe versucht worden, effektiv einen Hang zu erhalten über die Verwendung Jinja2. Ich möchte eine aktuelle Website optimieren, so dass es mehr Basis Vorlagen Vererbung hat, es Block-Tags Ersatz Inhalt vollständig verwendet, und überschreibt sie und verwenden Makros geben von Argumenten zu unterstützen.

Meine Basisvorlage enthält diesen Code (der Einfachheit halber bearbeitet):

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd">
{% from "foo.html" import macro1, macro2, macro3 %}
{% macro base_template(title=none, arg2=none, urls={}, arg3=false) %}
<html>
  <title>{{ title }} | Site.com</title>
  ....
  {{ caller() }}
  ....
</html>
{% endmacro %}

{% block content %}{% endblock %}

Und meine Seiten, die es so aussehen erweitern:

{% extends "base.html" %}
{% block content %}
{% call base_template(title="home", arg2="active", arg3="true") %}
(html code here)
{% endcall %}
{% endblock %}

alle Also im Grunde der Seiten Basis erstrecken, rufen sie einen Makro und Argumente übergeben zu diesem Makro. Ich verstehe nicht ganz, sie alle, aber die Hauptsache ist, dass diese Standardwerte und ein gewisses Maß an Flexibilität ermöglicht, die nicht einen ganzen Block erfordert eine Neudefinition: es gibt ein gewisses Maß an Flexibilität und Leistung. Auch hier wird diese stark vereinfacht.

Das einzige Problem ist, negiert diese meine Fähigkeit zu verwenden Blöcke. Makros sind für Flexibilität, aber mit Blöcken, ich habe die Fähigkeit, außer Kraft zu setzen, etwas ganz, oder es Eltern Inhalt und fügen Sie es verwenden, die ich nicht mit Makros tun kann (zumindest glaube ich nicht). Das Problem ist, ich kann nicht wickeln Dinge in Blöcken, sonst werden sie nicht die Werte in dem Makro sehen. Zum Beispiel, dies zu tun:

{% block title %}<title>{{ title }} | Site.com</title>{% endblock %}

fehl, weil es Titel nicht definiert sagen.

Letztes Ende für einen Weg, ich bin auf der Suche sowohl Energie und organiztional Aspekte der Blöcke zu nutzen, aber dennoch in der Lage sein, die Logik und Prägnanz von Makros zu verwenden. Wenn jemand mir jede Hilfe geben könnte, wie ich über dieses Problem gehen könnte, würde ich es wirklich schätzen.

War es hilfreich?

Lösung

Die Blöcke sind nur definierbare auf höchstem Niveau der Vorlage. Wenn Sie eine Vorlage erweitern, werden alle in der Kind-Vorlage festgelegten Werte einen set-Tag werden aus der Vorlage zugänglich sein wird, erstreckt. Zum Beispiel, wenn Sie eine Vorlage mit dem Namen layout.html haben:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd">
<html>
  <title>{{ title }} | Site.com</title>
  ....
  {% block content %}{% endblock content %}
  ....
</html>

Und Sie haben dieses Kind Vorlage, index.html:

{% extends "layout.html" %}
{% set title = 'Homepage' %}
{% block content %}
(html code here)
{% endblock content %}

Dann wird der Verweis auf title in der Mutter würde 'Homepage' lösen. Sie können mit jeder Art von Variable dies zu tun. Für das, was du tust, ich glaube nicht, gibt es keine Notwendigkeit für Makros - wenn Sie gut die Vorteile dieser Funktion und Ort Blöcke nehmen, werden Sie in der Lage sein, so ziemlich alles zu tun, müssen Sie so weit tun, wie Layouts angeht . Ich würde um einige der Plurk Solace verwendete Vorlagen suchen , die von einem der Jinja2 Autoren geschrieben werden, wenn Sie eine gute Vorstellung davon bekommen mögen, wenn verschiedene Funktionen von Jinja2 zu verwenden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top