Seite 1 von 1

[Django] Lazy template tags?

Verfasst: Freitag 8. Juli 2011, 18:14
von jens
Ist es möglich so etwas wie lazy template tags zu implementieren?

Beispiel:

Code: Alles auswählen

<html><body>
{% breadcrumbs %}
{% blog %}
</body>
</html>
Die Blog "Applikation" soll bei den breadcrumbs noch Links einfügen können...


In PyLucid hab ich dazu eine Aufwendigere und eigentlich unschöne Lösung. Die Funktioniert zwar, aber ich möchte sie verbessern.

In PyLucid heißt das context-middleware, siehe: http://www.pylucid.org/en/contribute/de ... middleware

Das Prinzip ist einfach:
Im Template steckt man Platzhalter wie z.B. <!-- ContextMiddleware breadcrumbs -->
Zu beginn eines Request, werden die ContextMiddleware Plugin initialisiert und alle anderen Plugins, wie z.B. das Blog, können die ContextMiddlewares nutzten und so z.B. einen Link in die Breadcrumbs einfügen...

Re: [Django] Lazy template tags?

Verfasst: Sonntag 10. Juli 2011, 20:36
von sparrow
Warum machst du daraus keinen Block und erweiterst dessen Inhalt statt ihn komplett zu überschreiben?

Re: [Django] Lazy template tags?

Verfasst: Montag 11. Juli 2011, 10:57
von jens
In der Tat. Wenn es nur um das erweitern der breadcrumbs Leiste geht, könnte man das so machen. Also mit block und super arbeiten.
So wird es ja auch mit der Navigation im django admin panel gemacht.

Das ganze hat allerdings auch Nachteile. Man kann keine Programmlogik auf diese Daten anwenden oder die Daten per Template rendern.

Re: [Django] Lazy template tags?

Verfasst: Montag 11. Juli 2011, 12:50
von sparrow
Die inclusion-tags kennst du?
https://docs.djangoproject.com/en/dev/h ... usion-tags

Damit hast du deine beiden Anforderungen erschlagen.

Re: [Django] Lazy template tags?

Verfasst: Montag 11. Juli 2011, 15:57
von jens
Hm. Ja das müßte gehen...

Haupttemplate:

Code: Alles auswählen

...
<p>
{% if preferences.print_index %}
  <a href="{{ preferences.index_url }}">{{ preferences.index|escape }}</a>{{ preferences.separator }}
{% endif %}
  {% block breadcrumbs %}{% include "breadcrumbs.html" %}{% endblock breadcrumbs %}
</p>

...
breadcrumbs.html:

Code: Alles auswählen

  {% for link in linklist %}
    <a href="{{ link.url }}"{% if link.title %} title="{{ link.title|escape }}"{% endif %}>{{ link.name|escape }}</a>
    {% if not forloop.last %}{{ preferences.separator }}{% endif %}
  {% endfor %}
Das Blog plugin macht dann in etwa:

Code: Alles auswählen

{% block breadcrumbs %}{{ block.super }}{% include "breadcrumbs.html" %}{% endblock %}

Wäre eine Überlegung wert...