2012-06-08 12 views
5

Ich bin in sehr seltsames Verhalten des Django-Vorlagensystems gelaufen. Ich habe eine Vorlagendatei, nämlich test.html, die sich rekursiv umfasst:Bedingtes Include-Tag in Django

{% include "test.html" %} 

Natürlich ist eine solche Vorlage hat keine Chance zu übertragen, da es keine Beendigungsbedingung ist. OK, lassen Sie uns versuchen, die folgenden:

{% if test_false %}{% include "test.html" %}{% endif %}, 

wo test_false eine Variable Vorlage und gleich False vergangen ist.

Man erwartet, dass es nicht nur etwas ist, aber es funktioniert:

RuntimeError at /test/ 
maximum recursion depth exceeded while calling a Python object 

Ich verstehe es nicht. Das Include-Tag kann Argumente aus dem aktuellen Kontext übernehmen. Daher bezweifle ich, dass es vor jedem anderen Teil der Seite ausgeführt wird. Warum ignoriert es Condition-Tag?

Antwort

6

Django hat eine Optimierung, die Vorlagen enthält, die bei der Kompilierung durch Konstanten angegeben werden.

Set Name der Vorlage zu variablen und es in dieser Art und Weise:

{% include test_template %} 

Django nicht in der Lage sein, es zu benutzen ist die Optimierung und den Code funktionieren soll.

-1

Wie Thomasz sagt, kann Django nur diese Optimierung machen, wenn der Pfad als ein konstanten String in der einschließlichen Vorlage definiert ist - etwa so:

{% include "test.html" %} 

Aber ich würde lieber nicht die Vorlage Pfad setzen muß in der Kontext aus Python-Code.

So, hier ist ein etwas in sich geschlossene Weg, um das gleiche Ergebnis zu erzielen - wickeln die sind in einem with:

{% with "test.html" as path %} 
    {% include path %} 
{% endwith %}