Me gustaría proporcionar el mismo contenido dentro de 2 archivos base diferentes.
Entonces estoy tratando de hacer esto:
page1.html:
{% extends "base1.html" %}
{% include "commondata.html" %}
page2.html:
{% extends "base2.html" %}
{% include "commondata.html" %}
El problema es que parece que no puedo usar extendidos e incluidos. ¿Hay alguna forma de hacer eso? Y si no, ¿cómo puedo lograr lo anterior?
commondata.html anula un bloque que se especifica en base1.html y base2.html
El propósito de esto es proporcionar la misma página en formato pdf y html, donde el formato es ligeramente diferente. Sin embargo, la pregunta anterior simplifica lo que estoy tratando de hacer, así que si puedo obtener una respuesta, resolverá mi problema.
fuente
De los documentos de Django:
Entonces Django no toma ningún bloque de su commondata.html y no sabe qué hacer con los bloques externos de html renderizados.
fuente
Esto debería ser el truco para usted: coloque la etiqueta de inclusión dentro de una sección de bloque.
page1.html:
page2.html:
fuente
Más información sobre por qué no funcionó para mí en caso de que ayude a las personas futuras:
La razón por la que no funcionaba es que a {% include%} en django no le gustan los caracteres especiales como el elegante apóstrofe. Los datos de la plantilla que intentaba incluir se pegaron de Word. Tuve que eliminar manualmente todos estos caracteres especiales y luego se incluyeron correctamente.
fuente
No puede extraer bloques de un archivo incluido en una plantilla secundaria para anular los bloques de la plantilla principal. Sin embargo, puede especificar un padre en una variable y tener la plantilla base especificada en el contexto.
De la documentación :
En lugar de separar "page1.html" y "page2.html", colóquelo
{% extends base_template %}
en la parte superior de "commondata.html". Y luego, en su opinión, definabase_template
que sea "base1.html" o "base2.html".fuente
Agregado como referencia para futuras personas que encuentren esto a través de Google: es posible que desee ver la etiqueta {% overextend%} proporcionada por la biblioteca mezzanine para casos como este.
fuente
Edición 10 de diciembre de 2015 : como se señaló en los comentarios, ssi está en desuso desde la versión 1.8. Según la documentación:
En mi opinión, la (mejor) respuesta correcta a esta pregunta es la de podshumok , ya que explica por qué el comportamiento de include cuando se usa junto con la herencia.
Sin embargo, me sorprendió un poco que nadie mencionara la etiqueta ssi proporcionada por el sistema de plantillas de Django, que está diseñado específicamente para incluir un texto externo en línea . Aquí, en línea significa que el texto externo no será interpretado, analizado o interpolado, sino que simplemente "copiado" dentro de la plantilla de llamada.
Por favor, consulte la documentación para obtener más detalles (asegúrese de verificar su versión apropiada de Django en el selector en la parte inferior derecha de la página).
https://docs.djangoproject.com/en/dev/ref/templates/builtins/#ssi
De la documentación:
Tenga cuidado también con las implicaciones de seguridad de esta técnica y también con la definición requerida de ALLOWED_INCLUDE_ROOTS, que debe agregarse a sus archivos de configuración.
fuente