Seite 1 von 1

[jinja] extends und zentral definierte blocks...

Verfasst: Mittwoch 29. März 2006, 07:11
von jens
Jinja hat ja diesen "extends"-Tag: http://wsgiarea.pocoo.org/jinja/docs/inheritance.html

Ich benutzte das auch schon. Nun frage ich mich allerdings, wie ich einen Block zentral in einer seperaten Datei definieren kann. Diesen möchte ich dann in zwei anderen Templates einbinden???

Das klappt mit dem "extends" Tag nicht wirklich, oder? Es müßte viel mehr sowas wie ein import/include Tag geben, oder sehe ich da was falsch?

Verfasst: Mittwoch 29. März 2006, 12:39
von mitsuhiko
Wenn du Blöcke von anderen Dateien reinladen willst kannst du in der SVN Version das Prepare Tag verwenden:

"blocks.html"

Code: Alles auswählen

{% prepare "dialog" accepting title, text %}
<div id="dialog">
  <h2>{{ title|escapexml }}</h2>
  {{ text|escapexml|nl2pbr }}
{% endprepare %}
"myfile.html"

Code: Alles auswählen

{% require "blocks" %}

{% for dialog in dialogs %}
  {% call "dialog", dialog.title, dialog.text %}
{% endfor %}

Verfasst: Mittwoch 29. März 2006, 12:48
von jens
Hm. Also irgendwie erscheint mir das etwas unübersichlich... Kann man es nicht so machen:

"shared_blocks.html"

Code: Alles auswählen

{% block "dialog" %}
<div id="dialog">
  <h2>{{ title|escapexml }}</h2>
  {{ text|escapexml|nl2pbr }}
{% endblock %}
"template.html"

Code: Alles auswählen

{% import "shared_blocks.html" %}

Der Dialog:
{% marker "dialog" %}
...blabla...

Verfasst: Mittwoch 29. März 2006, 13:12
von mitsuhiko
Das hat ein Problem und einen Nachteil :-)

Zuerst das Problem. Blöcke und marker gegen in beide Richtungen. Das heißt sie können sowohl überschrieben werden oder selber überschreiben.

Der Nachteil ist, das man solche Blöcke meist für Dialoge oder ähnliches verwendet. Und da hat es wenig Sinn direkt den Context zu übergeben. Sowas wie die Schleife bekommst du mit deiner Lösung nicht hin.

Du kannst aber statt {% require %} auch {% include %} verwenden, der unterschied ist nur, dass require selbst nichts ausgibt, include aber das includierte Template erst mal rendert. Resultat könnten einige Leerstellen sein.