2012-06-08 14 views
5

Mi sono imbattuto in un comportamento molto strano del sistema di template Django. Ho un file di modello, vale a dire test.html, che a sua volta comprende in modo ricorsivo:Tag di inclusione condizionale in Django

{% include "test.html" %} 

Naturalmente, tale modello ha alcuna possibilità di essere reso, dal momento che non v'è alcuna condizione di finitura. OK, proviamo il seguente:

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

dove test_false è una variabile passata al modello e pari a False.

Uno si aspetta che semplicemente non includere qualsiasi cosa, ma lo fa:

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

io non capisco. Il tag include può assumere argomenti dal contesto corrente, quindi dubito che venga eseguito prima di qualsiasi altra parte della pagina. Allora perché ignora il tag delle condizioni?

risposta

6

Django ha un'ottimizzazione che include modelli forniti da costanti alla compilazione.

Set nome del modello da variabile e includerlo in questo modo:

{% include test_template %} 

Django non sarà in grado di utilizzare è l'ottimizzazione e il codice dovrebbe funzionare.

-1

Come Thomasz dice, Django può solo fare questa ottimizzazione se il percorso è definito come una stringa costante nel modello tra cui - in questo modo:

{% include "test.html" %} 

Ma non avrebbe preferito mettere il percorso del modello in il contesto dal codice Python.

ecco un autonomo modo un po 'più di raggiungere lo stesso risultato - avvolgere il includono in un with:

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