Ich möchte dasselbe {% block%} zweimal in derselben Django-Vorlage verwenden. Ich möchte, dass dieser Block mehr als einmal in meiner Basisvorlage angezeigt wird:
# base.html
<html>
<head>
<title>{% block title %}My Cool Website{% endblock %}</title>
</head>
<body>
<h1>{% block title %}My Cool Website{% endblock %}</h1>
</body>
</html>
Und dann erweitern Sie es:
# blog.html
{% extends 'base.html' %}
{% block title %}My Blog{% endblock %}
# pictures.html
{% extends 'base.html' %}
{% block title %}My Pictures{% endblock %}
# cats.html
{% extends 'base.html' %}
{% block title %}My Cats{% endblock %}
Ich werde eine Ausnahme bekommen, da Django möchte, dass der Block nur einmal erscheint:
TemplateSyntaxError at /
Das Tag 'block' mit dem Namen 'title' wird mehrmals angezeigt
Eine schnelle und schmutzige Lösung würde den Block sein Duplizieren Titel in title1 und title2 :
# blog.html
{% extends 'base.html' %}
{% block title1 %}My Blog{% endblock %}
{% block title2 %}My Blog{% endblock %}
Dies ist jedoch ein Verstoß gegen das DRY- Prinzip. Es wäre sehr schwierig, da ich viele Vorlagen erbe und auch, weil ich nicht zur Hölle fahren will ;-)
Gibt es einen Trick oder eine Lösung für dieses Problem? Wie kann ich denselben Block in meiner Vorlage wiederholen, ohne den gesamten Code zu duplizieren?
quelle
Antworten:
Ich denke, dass die Verwendung des Kontextprozessors in diesem Fall ein Overkill ist. Sie können dies leicht tun:
und dann:
und so weiter ... Sieht aus wie DRY-kompatibel.
quelle
h1
Inhalts innerhalb des Blocks, der das definierttitle
. Oder ein Block, der einen Teil des definierttitle
.Verwenden Sie das Django-Vorlagenmakro-Plugin:
https://gist.github.com/1715202 (django> = 1.4)
oder
http://www.djangosnippets.org/snippets/363/ (django <1.4)
django> = 1,4
und
Django <1.4
und
quelle
Sie möchten wahrscheinlich keinen Block verwenden, sondern nur eine Variable:
Anschließend legen Sie den Titel im Kontext fest.
quelle
Hier ist ein Weg, den ich entdeckt habe, als ich versucht habe, dasselbe selbst zu tun:
Erfordert leider eine zusätzliche Datei, erfordert jedoch nicht, dass Sie den Titel aus der Ansicht übergeben.
quelle
<tr>
Reihe war ziemlich komplex.Sie können
{% include subtemplate.html %}
mehr als einmal verwenden. Es ist nicht dasselbe wie Blöcke, aber es macht den Trick.quelle
include
langsamer ist alsblock
. docs.djangoproject.com/de/1.10/topics/performance/…Hier gibt es einige Diskussionen: http://code.djangoproject.com/ticket/4529 Offensichtlich lehnt das Django-Kernteam dieses Ticket ab, weil es der Meinung ist, dass dies kein häufig verwendetes Szenario ist, aber ich bin anderer Meinung.
Der Wiederholungsblock ist eine einfache und saubere Implementierung: https://github.com/SmileyChris/django-repeatblock
Vorlagenmakros sind andere, der Autor erwähnte jedoch, dass sie nicht sorgfältig getestet wurden: http://www.djangosnippets.org/snippets/363/
Ich habe Repeatblock verwendet.
quelle
Als Update für alle, die darauf stoßen, habe ich das oben erwähnte Snippet in eine Vorlagen-Tag-Bibliothek (Django-Makros) umgewandelt, die die Makros leistungsfähiger macht und auch ein wiederholtes Blockmuster explizit implementiert : Django-Makros .
quelle
Hier ist eine leichte Lösung, die der obigen
do_set
und derdo_get
Antwort auf das Vorlagen-Tag ähnelt . Mit Django können Sie den gesamten Vorlagenkontext an ein Tag übergeben, mit dem Sie eine globale Variable definieren können.base.html:
page.html:
Benutzerdefiniertes Tag (kam hier auf die Idee: https://stackoverflow.com/a/33564990/2747924 ):
Vergessen
{% load %}
Sie auch nicht, Ihre benutzerdefinierten Tags zu verwenden oder sie zur Liste der integrierten Vorlagenoptionen hinzuzufügen, damit Sie sie nicht in jede Vorlage laden müssen. Die einzige Einschränkung für diesen Ansatz besteht darin{% define %}
, dass er innerhalb eines Block-Tags aufgerufen werden muss, da untergeordnete Vorlagen nur Block-Tags rendern, die mit den übergeordneten Tags übereinstimmen. Ich bin mir nicht sicher, ob es einen Weg gibt, das zu umgehen. Stellen Sie außerdem sicher, dass derdefine
Anruf eingeht, bevor Sie versuchen, ihn offensichtlich zu verwenden.quelle
Aufbauend auf Van Gales Vorschlag können Sie get- und set-Tags erstellen, indem Sie Ihrer Datei templatetags.py Folgendes hinzufügen:
Setzen Sie dann Werte in einer Vorlage über
{% set foo %}put data here{% endset %}
und erhalten Sie sie über{% get foo %}
in einer anderen.quelle
Auch ich habe in meinen Vorlagendateien das gleiche Bedürfnis nach einem wiederholten {% block%} festgestellt. Das Problem ist, dass ich möchte, dass ein Django {% block%} in beiden Fällen einer Django-Bedingung verwendet wird, und dass der {% block%} von nachfolgenden Dateien überschrieben werden soll, die die aktuelle Datei möglicherweise erweitern. (In diesem Fall ist das, was ich möchte, definitiv eher ein Block als eine Variable, da ich sie technisch nicht wiederverwenden kann. Sie wird nur an beiden Enden einer Bedingung angezeigt.
Das Problem:
Der folgende Django-Vorlagencode führt zu einem Vorlagensyntaxfehler, aber ich denke, es ist ein gültiger "Wunsch", einen definierten {% block%} in einer Bedingung wiederzuverwenden (IE, warum überprüft der Django-Parser die Syntax an BEIDEN Enden? Sollte eine Bedingung nicht nur die WAHRHEITsbedingung validieren?)
Die Lösung:
Sie können ein {% include%} verwenden, um einen {% block%} mehr als einmal bedingt einzufügen. Dies hat bei mir funktioniert, da der Django-Syntaxprüfer nur die WAHRHEIT {% include%} enthält. Siehe das Ergebnis unten:
quelle
Ich benutze diese Antwort , um die Dinge trocken zu halten.
quelle
Hierfür gibt es zwei einfache Lösungen.
Am einfachsten ist es, Ihren Titel in eine Kontextvariable einzufügen. Sie würden die Kontextvariable in Ihrer Ansicht festlegen.
Wenn Sie so etwas wie generische Ansichten verwenden und keine views.py für Bilder, Katzen usw. haben, können Sie ein benutzerdefiniertes Vorlagen-Tag verwenden, das eine Variable im Kontext festlegt .
Wenn Sie diesen Weg gehen, können Sie Folgendes tun:
Dann in Ihrer base.html:
quelle
Any variable set in the context will only be available in the same block of the template in which it was assigned. This behavior is intentional; it provides a scope for variables so that they don’t conflict with context in other blocks.
Die ausgewählte Antwort spielt auf eine einfache Problemumgehung an, bei der ein Tag in ein anderes in der untergeordneten Vorlage eingeschlossen wird, um beiden den gleichen Wert zu geben. Ich benutze dies für solche sozialen Bilder.
Untergeordnete Vorlage:
Dann im Elternteil
base.html
:quelle
In Zweig können Sie dies wie folgt machen:
quelle