2010-08-11 10 views
8

En el sistema de plantillas de Django, si tengo un bloque que quiero hacer opcional con una instrucción if, ¿cómo lo hago?¿Hay alguna forma de hacer que un bloque sea opcional en la plantilla de Django?

yo estaba tratando esto:

{% if val %}{% block title %}Archive {{ foo }}{% endblock %}{% endif %} 

Pero eso no funciona. ¿Hay alguna manera de hacerlo, de modo que para un valor dado (en este caso nulo) el bloque no se emite y la plantilla base usa los valores originales?

Editar: Déjame ser un poco más específico, por lo que es más fácil de responder.

Tengo una página con 10 entradas por página. El usuario puede pasar a la página siguiente y ver los siguientes diez elementos. Para cada página adicional que van, más allá de la primera, me gustaría que la etiqueta del título diga algo como "Archivo 1" o "Archivar 10", pero si vuelven a la página original, ya no es archivo, y debería solo vaya al título original del sitio ya dado en las plantillas base.

+0

No conozco la respuesta a su pregunta, pero ¿conoce el filtro 'predeterminado'? ¿Hace eso lo que quiere? http://docs.djangoproject.com/en/dev/ref/templates/builtins/#default –

+0

Gracias Dominic, estoy buscando algo así, pero no estoy buscando una forma de asignar un valor predeterminado, Estoy tratando de averiguar si puedo poner una instrucción if en bloques. – Vernon

Respuesta

8

Por lo que yo entiendo, block s son marcadores de posición para ser "reemplazados" en las plantillas secundarias. Deben definirse en "tiempo de compilación" y no en "tiempo de ejecución".

En cuanto a su problema específico, ¿por qué no modificar el título en función del número de página (suponiendo que use la paginación)? Algo como esto:

{% block title %} 
    {% ifequal page 1 %}Current{% else %}Archive {{ page }}{% endifequal %} 
{% endblock %} 
15

me encontré con un problema similar con un proyecto que estoy trabajando. He aquí cómo lo resolví usando {{}} block.super para tirar el valor por defecto del bloque padre:

Mi plantilla padre contiene:

{% block title %}Default Title{% endblock %} 

Mi plantilla hija contiene:

{% block title %} 
    {% if new_title %}{{ new_title }}{% else %}{{ block.super }}{% endif %} 
{% endblock %} 

* Nota: Es posible que desee ajustar el código en {% spaceless%} {% endspaceless%} si planea usar el resultado en una etiqueta de título HTML.

(Parece que Jordan Reiter registró la misma solución en los comentarios de la pregunta original un poco antes de mi respuesta.)

+0

Gracias, supe desde el principio que podía simplemente poner las declaraciones dentro del bloque, me preguntaba, supongo, si haría un bloque opcional, supongo que no. – Vernon

+0

¡Brillante! Esto me permite activar/desactivar bloques en función de un valor de formulario (para que pueda tener una versión imprimible del resultado). – sage

+1

'{{block.super}}' hizo el truco. – AliBZ

0

sólo tendría que añadir a las buenas respuestas anteriores que, dependiendo de la versión de Django veces el {{ block.super }} pone el contenido del maestro dos veces, esto parece ocurrir en las versiones más recientes de Django.

estoy usando Django 1.8 y cada vez que pongo la {{ block.super }} empezó a comportarse de esa manera solo como una adición a la respuesta Jamie puedo decir que en la plantilla base se puede poner el contenido que desea

{% block title %} Default Title {% endblock %} 

Y luego, en el niño, si quiere que el pie de página se herede y se muestre, simplemente no haga nada. Pero si usted no quiere que el bloque que se muestra a continuación, poner la etiqueta en el niño con contenido vacío como este:

{% block title %} 

{% endblock %} 

Entonces se oculta una vez que se representa también puede sobrescribir el contenido en él si tú deseas.

Cuestiones relacionadas