2012-06-08 35 views
5

Me encontré con un comportamiento muy extraño del sistema de plantillas de Django. Tengo un archivo de plantilla, es decir test.html, que incluye a sí misma recursivamente:Etiqueta de inclusión condicional en Django

{% include "test.html" %} 

Por supuesto, dicha plantilla tiene ninguna posibilidad de ser prestados, ya que no hay ninguna condición de acabado. OK, vamos a tratar lo siguiente:

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

donde test_false es una variable pasada a la plantilla e igual a False.

Uno espera que simplemente no va a incluir cualquier cosa, pero lo hace:

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

Yo no lo entiendo. La etiqueta Incluir puede tomar argumentos del contexto actual, por lo que dudo que se ejecute antes que cualquier otra parte de la página. Entonces, ¿por qué ignora la etiqueta de condición?

Respuesta

6

Django tiene una optimización que incluye plantillas que se dan por constantes en la compilación.

nombre de Conjunto de la plantilla a la variable e incluirla en esa forma:

{% include test_template %} 

Django no será capaz de utilizar su optimización y su código debería funcionar.

-1

Como Thomasz dice, Django sólo puede realizar esta optimización si la ruta se define como una cadena constante en el que incluye la plantilla - de este modo:

{% include "test.html" %} 

Pero preferiría no tener que poner la ruta de plantilla en el contexto del código de Python.

Así que aquí es un autónomo manera un poco más de conseguir el mismo resultado - envuelva la incluyen en un with:

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