¿Podemos agregar a un {% block%} en lugar de sobrescribirlo?

116

En mi core.html tengo un bloque etiquetado como javascript. Sería genial si pudiera agregar más líneas a este bloque sin sobrescribir todo lo que contiene.

PKKid
fuente

Respuestas:

9

El uso block.superfunciona bien cuando se extiende una plantilla, pero no tan bien cuando se incluye una, es decir:

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

Supongamos que desea 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: llamar block.supera la plantilla incluida fallará.

Cf. Problemas de Django # 7324 , # 12008 , # 13399 y la actualización relacionada de la documentación . Cf. incluir nota de etiqueta :

La etiqueta de inclusión debe considerarse como una implementación de “renderizar esta subplantilla e incluir el HTML”, no como “analizar esta subplantilla e incluir su contenido como si fuera parte del padre”. 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 incluirlos. Esto significa que una plantilla que incluye bloques de otra contendrá bloques que ya han sido evaluados y renderizados, no bloques que puedan ser reemplazados por, por ejemplo, una plantilla de extensión.

En ese caso, recomendaría usar django-sekizai , que te permite 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 comencé este proyecto fue la falta de un buen marco multimedia (css / js) en django y django-cms. Sí, existe la clase Media utilizada en formularios en django, pero en realidad eso no funciona tan bien. Por lo general, los chicos de la interfaz quieren decidir qué archivos css y javascript se incluirán y no quieren tener que editar archivos de Python para cambiar eso, ni yo quería que cambiaran mis archivos de Python. Por lo tanto, era necesario permitirle editar el contenido de las plantillas que están antes o después del punto en el que se encuentra ahora. También quería que se eliminaran los duplicados. Como resultado, escribí django-sekizai, que hace exactamente eso. Es similar a los bloques, solo que en lugar de heredarlos, los extiende.

Maxime R.
fuente