2012-08-23 44 views
25

He estado tratando de llamar a un bloque dentro de una condición if en la plantilla django.Bloque de llamada dentro de una condición if: plantilla django

Tengo base template. Tengo muchas otras plantillas que extienden la plantilla base. he definido un bloque en plantilla base:

{% block test_block %}Test{% endblock %} 

I a continuación, desea anular este bloque en una determinada condición en las otras plantillas. Si la condición falla, el bloque no debe ser anulado. Esto es algo que he escrito:

{% if test_value %}{% block test_block %}Development{% endblock %}{% endif %} 

Esto realmente (o puede ser virtualmente) ignora la condición if.

Lo que finalmente hizo:

{% block test_block %}{% if test_value %}Development{% else %}{{ block.super }}{% endif %}{% endblock %} 

que tenía que hacer algo como esto en todas partes se requiere.

¿Es esta la mejor manera? ¿Es esta la única manera? ¿Por qué no puedo probar la primera manera de la mía? ¿O hay algún error por mi parte?

+0

¿cuál es su versión de django? –

+0

Ver también http://stackoverflow.com/questions/942797/why-cant-i-nest-a-block-tag-inside-an-if-tag – Bryce

+0

Gracias, me he estado dando vueltas por esto durante horas – pmont

Respuesta

13

No ha cometido un error: los bloques de plantilla se incluyen independientemente de cualquier condición a su alrededor. Esto se puede ver a partir de esta línea de la clase ExtendsNode de django/template/loader_tags.py en el Django source code:

self.blocks = dict([(n.name, n) for n in nodelist.get_nodes_by_type(BlockNode)]) 

Cuando se está representando la {% extends %}, se va a buscar todos los nodos de bloque de la plantilla directamente y los almacena para la prestación cuando el padre se encuentra con aquellos block s. Si esos bloques en el niño estaban dentro de condicionales o no, no se considera.

+0

¿Hay alguna solución para esto? – jsmedmar

Cuestiones relacionadas