2009-11-12 14 views

Respuesta

4

Usando block.super funciona bien cuando se extiende una plantilla pero no tan bien cuando se incluye uno, es decir:

{% extends "base.html" %} vs. {% include "partial.html" %} 

decir que quiere incluir una plantilla en el medio de su página y también le gustaría agregar algo de javascript en un bloque al final de la página: se bloqueará la llamada al block.super en la plantilla incluida.

Cf. Django emite #7324, #12008, #13399 y related update to the documentation. Cf. include tag nota:

La etiqueta include debe ser considerada como una implementación de “hacer que esta subtemplate e incluir el código HTML”, no como “analizar esta subtemplate e incluir su contenido como si fuera parte de los padres”. Esto significa que no hay un estado compartido entre las plantillas incluidas; cada inclusión es un proceso de representación completamente independiente.

Los bloques se evalúan antes de que se incluyan. Esto significa que una plantilla que incluye bloques de otra contendrá bloques que ya han sido evaluados y procesados, no bloques que pueden ser reemplazados por, por ejemplo, una plantilla extendida.

En ese caso, le recomiendo usar django-sekizai, cosa que le permiten hacer cosas como:

{% load sekizai_tags %} 

           ⎧ <p>Some content</p> 
<p>Some content</p>    | {% addtoblock "js" %} 
           | <script type="text/javascript"> 
{% include "partial.html" %} -> ⎨  alert("Hello django-sekizai"); 
           | </script> 
<p>Some more content</p>  ⎩ {% endaddtoblock %} 


{% render_block "js" %} 

De django-sekizai README:

La razón principal por la que empecé este proyecto fue la falta de un buen marco de medios (css/js) en django y django-cms. Sí, existe la clase Media utilizada en los formularios de django, pero realmente eso no funciona tan bien. Por lo general, los chicos frontend quieren decidir si se incluirán los archivos css y javascript y no quieren tener que editar los archivos Python para cambiarlos, ni tampoco quiero que cambien mis archivos Python. Por lo tanto, hubo una necesidad de permitirle editar los contenidos de las plantillas que están antes o después del punto donde se encuentra ahora. También quería eliminar los duplicados. Como resultado escribí django-sekizai, que hace exactamente eso. Es similar a los bloques, simplemente en lugar de heredarlos, los extiendes.

Cuestiones relacionadas