Wie füge ich eine Vorlage in eine andere Vorlage ein?

75

Ich habe eine sehr einfache Vorlage (basic_template.html) und möchte diese mit Daten ausfüllen, die mit einer anderen Teilvorlage formatiert wurden. Die Datei basic_template.html enthält möglicherweise mehrere Elemente, die mit der Teilvorlage formatiert wurden.

Wie soll ich den Code in views.py strukturieren?

Der Grund, warum ich das mache, ist, dass das später mit Ajax gefüllt wird. Mache ich das richtig

WindowsMaker
quelle

Antworten:

139

Du kannst tun:

<div class="basic">
{% include "main/includes/subtemplate.html" %}    
</div>

Wo subtemplate.htmlist eine andere Django-Vorlage? Hier können subtemplate.htmlSie den HTML-Code einfügen, der mit Ajax erhalten wird.

Sie können die Vorlage auch mehrmals einfügen:

<div class="basic">
{% for item in items %}
    {% include "main/includes/subtemplate.html" %}    
{% endfor %}
</div>
Simeon Visser
quelle
Entschuldigung, ich habe vergessen zu erwähnen: Die Untervorlage wird möglicherweise mehrmals in die Datei basic_template.html
WindowsMaker
1
Das ist auch möglich, Sie können eine Vorlage in eine for-Schleife in die Vorlage aufnehmen, siehe die aktualisierte Antwort.
Simeon Visser
1
Sollte ich in der Item-Schleife nicht Item im Subtemplate-Kontext übergeben, wie {% include "includes/subtemplate.html" with item=item %}?
Capi Etheriel
8
@barraponto Sie können das tun, ist aber itembereits in der Untervorlage verfügbar. Wenn Sie den Kontext der Untervorlage sauber halten möchten, können Sie {% include "includes/subtemplate.html" with item=item only %}nur itemvom übergeordneten Element zur Untervorlage übergeben.
Simeon Visser
Dies sollte irgendwo in den Django-Dokumenten hinzugefügt werden! Danke für die hilfreiche Antwort.
Varagrawal
22

Sie können dies mit einem Block tun . Blöcke sind ein Django-Vorlagen-Tag, das Abschnitte einer Vorlage überschreibt, die Sie erweitern. Ich habe unten ein Beispiel aufgenommen.

basic_template.html

<body>
{% block 'body' %}
{% endblock %}
</body>

Vorlage, die Sie einschließen möchten: (dh example.html)

{% extends 'basic_template.html' %} 
{% block 'body' %}
/* HTML goes here */
{% endblock %}

views.py :

return render_to_response(template='example.html', context, context_instance)

Dadurch wird basic_template.html geladen , aber alles, was {% block 'body' %} {% endblock %}in basic_template.html enthalten ist , wird durch alles ersetzt, was darin enthalten ist {% block 'body' %} {% endblock %}.

Weitere Informationen zu Blöcken und Vorlagenvererbung finden Sie in den Django-Dokumenten

Wipqozn
quelle
Was ist der Unterschied zwischen dieser Vorgehensweise und der Ausführung von {% include "main / includes / example.html"%}?
Michael Lafayette
3
@MichaelLafayette, denken Sie an verlängern als erben, während als importieren.
Mox
1
Gibt es Leistungsvorteile bei der Verwendung eines Ansatzes gegenüber dem anderen? Der {% include "main/includes/example.html" %}Ansatz sieht einfacher aus (er bestätigt KISS ).
Hassan Baig
0

Ich wollte nur Unterschiede in Bezug auf Erweiterung und Einbeziehung hinzufügen. Sowohl Vorlage als auch Include können Modelle verwenden, die in die aktuelle App eingefügt wurden. Die Vorlage ist für die globale Verwendung durch Ihre beliebige App vorgesehen. Include ist für die Verwendung in bestimmten Apps vorgesehen. Zum Beispiel: Sie möchten den Image Slider in Ihre Homepage und über die Seite einfügen, aber nirgendwo anders. Sie können die Slider-App zur Vereinfachung mit einem eigenen Modell erstellen, das Modell importieren und in diese Seiten aufnehmen. Wenn Sie für dieses Beispiel eine Vorlage verwendet haben, würden Sie zwei Vorlagen erstellen, eine mit Schieberegler und alle anderen Vorlagen.

oljik
quelle