2016-05-01 8 views
16

Ich möchte meiner Layoutvorlage etwas Flexibilität hinzufügen, aber ich finde keine Möglichkeit, dies zu tun.Ist es eine Möglichkeit, die Variable in Django an die 'erweiterte' Vorlage zu übergeben?

Ich bin auf der Suche nach einer Möglichkeit, extend Layout-Vorlage mit Variable, d. H. Variablen im Vorlagenbaum nicht nach unten übergeben.

# views.py 
def my_view_func(request): 
    return render(request, "child.html") 

# child.html 
{% extends 'layout.html' with show_sidebar=True sidebar_width_class="width_4" %} 

<div>Templates stuff here</div> 

# layout.html 
{% if show_sidebar %} 
    <div class="{{ sidebar_width_class }}"> 
     {% block sidebar %}{% endblock %} 
    </div> 
{% endif %} 

Ich habe jetzt vier Vorlagen mit dem Unterschied, in wenigen Zeilen Code zu erhalten. Zum Beispiel habe ich zwei Vorlagen, die sich durch die Breite der Seitenleiste unterscheiden. Mache ich etwas falsch?

+0

@xpy, nee. In meiner Frage suche ich nach einer Möglichkeit, die Layoutvorlage mit der Variablen zu erweitern, d. H. Die Variable in der Vorlagenstruktur nicht nach unten zu übergeben. –

+0

Entschuldigung, missverstanden. – xpy

+3

Warum werden Sie Ihre Variablen nicht mit Kontext übergeben? Render (request, "child.html", {'sidebar_width': "width_4"}) '? –

Antwort

2

Ich vermute, dass block ist, was Sie in erster Linie suchen.

Bilden Sie sich Ihr Block innerhalb der Basis-Vorlage wie folgt aus:

{% block sidebar_wrapper %} 
    {% if sidebar %} 
    <div class="width{{sidebar_width}}"> 
     {% block sidebar %}{% endblock %} 
    </div> 
    {% endif %} 
{% endblock sidebar_wrapper%} 

Und auf Ihrem Kind Vorlage:

{% extends 'layout.html' %} 
{% block sidebar_wrapper %} 
    {% with sidebar=True sidebar_width=4 %} 
     {{ block.super }} 
    {% endwith%} 
{% endblock sidebar_wrapper%} 
+0

Nein. In diesem Beispiel geht es darum, Variablen zu übergeben. Wenn wir Templates rendern und das Layout erweitern, haben wir keine solche Möglichkeit. –

+0

Ich habe meine Frage aktualisiert, hoffe jetzt, es wäre klarer. –

+0

@AlexT wie ist das "down"?Die 'sidebar_wrapper' befindet sich in der Elternvorlage und in der Kindvorlage definieren Sie, welche Werte im Block der Elternvorlage mit der Anweisung' with' verwendet werden sollen. – xpy

5

Was Sie brauchen, ist ein Include-Template-Tag. Sie können eine Vorlage in eine andere Vorlage einfügen und diese mit einem bestimmten Kontext rendern.

{% include 'layout.html' with sidebar=True sidebar_width=4 %} 

prüfen docs hier: https://docs.djangoproject.com/en/1.9/ref/templates/builtins/#include

+4

Ich möchte die Vorlage erweitern, um sie nicht einzuschließen. –

+0

Ihr Sidebar-Teil sieht wie ein Snippet aus und ist über einen Kontext konfigurierbar. Warum also nicht das Sidebar-Snippet in einer Vorlage speichern und es in andere Vorlagen mit spezifischem Kontext einfügen? Sie sollten denken, dass die Seitenleiste eine gemeinsame konfigurierbare Vorlage ist, die nicht von ihr ausgeht. –

+0

Sidebar ist definitiv, was ist mit Layoutvorlagen ohne Sidebar? f. Ich habe Seiten mit sidebar width3, width4 und ohne Sidebar überhaupt. Inhaltsteil dieser drei Layouts unterscheiden sich voneinander und Inhalt Teil Markup ist ziemlich kompliziert, um es jedes Mal in {% Blockinhalt%} –

Verwandte Themen