ciudadano neto
Me gustaría proporcionar el mismo contenido dentro de 2 archivos base diferentes.
Entonces, estoy tratando de hacer esto:
pagina1.html:
{% extends "base1.html" %}
{% include "commondata.html" %}
página2.html:
{% extends "base2.html" %}
{% include "commondata.html" %}
El problema es que parece que no puedo usar tanto extender como incluir. ¿Hay alguna manera de hacer eso? Y si no, ¿cómo puedo lograr lo anterior?
commondata.html
anula un bloque que se especifica en ambos base1.html
y base2.html
El propósito de esto es proporcionar la misma página en ambos pdf
y html
formato, 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.
Matt Howell
Cuando usa la etiqueta de plantilla extendida, está diciendo que la plantilla actual extiende otra, que es una plantilla secundaria, que depende de una plantilla principal. Django observará su plantilla secundaria y usará su contenido para completar la plantilla principal.
Todo lo que desee usar en una plantilla secundaria debe estar dentro de los bloques, que Django usa para completar la plantilla principal. Si desea usar una declaración de inclusión en esa plantilla secundaria, debe colocarla dentro de un bloque, para que Django le dé sentido. De lo contrario, simplemente no tiene sentido y Django no sabe qué hacer con él.
La documentación de Django tiene algunos ejemplos realmente buenos del uso de bloques para reemplazar bloques en la plantilla principal.
https://docs.djangoproject.com/en/dev/ref/templates/language/#template-heritance
-
mi commondata.html tiene el bloque definido en él. Pero no está reemplazando el bloque de la plantilla principal… Si en lugar de hacer una inclusión, escribo los datos exactos dos veces en page1.html y page2.html, entonces, por supuesto, funciona. Pero quiero tener en cuenta esa similitud en commondata.html.
– Ciudadano neto
11 de septiembre de 2009 a las 4:17
-
Parece funcionar, recuerdo haber intentado esto, pero debo haber tenido un error tipográfico o algo así en ese momento que hizo que no funcionara.
– Ciudadano neto
11 de septiembre de 2009 a las 4:19
-
vea mi respuesta a continuación para saber por qué no funcionó para mí la primera vez, sin embargo, lo dejaré con la respuesta aceptada porque respondió la pregunta que hice correctamente.
– Ciudadano neto
11 de septiembre de 2009 a las 5:22
De los documentos de Django:
La etiqueta de inclusión se debe considerar como una implementación de “representar 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.
Entonces, Django no toma ningún bloque de su commondata.html y no sabe qué hacer con los bloques externos de html procesados.
Esto debería funcionar para usted: coloque la etiqueta de inclusión dentro de una sección de bloque.
pagina1.html:
{% extends "base1.html" %}
{% block foo %}
{% include "commondata.html" %}
{% endblock %}
página2.html:
{% extends "base2.html" %}
{% block bar %}
{% include "commondata.html" %}
{% endblock %}
-
¿Qué significado tienen aquí los bloques ‘foo’ o ‘bar’? ¿Los hace referencia en las plantillas base? Me estoy rascando la cabeza en cuanto a por qué esto funcionaría.
– AlxVallejo
1 de marzo a las 16:35
Más información sobre por qué no me funcionó en caso de que ayude a futuras personas:
La razón por la que no funcionaba es que a {% include %} en django no le gustan los caracteres especiales como el apóstrofo elegante. Los datos de la plantilla que estaba tratando de incluir se pegaron desde Word. Tuve que eliminar manualmente todos estos caracteres especiales y luego se incluyó con éxito.
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.
Desde el documentación:
{% extiende la variable%} usa el valor de la variable. Si la variable se evalúa como una cadena, Django usará esa cadena como el nombre de la plantilla principal. Si la variable se evalúa como un objeto Plantilla, Django usará ese objeto como plantilla principal.
En lugar de separar “page1.html” y “page2.html”, coloque {% extends base_template %}
en la parte superior de “commondata.html”. Y luego, en su opinión, defina base_template
ser “base1.html” o “base2.html”.
ted
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.
tonio
Editar 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:
Esta etiqueta ha quedado obsoleta y se eliminará en Django 1.10. Utilice la etiqueta de inclusión en su lugar.
En mi opinión, la (mejor) respuesta correcta a esta pregunta es la de podshumokya que explica por qué el comportamiento de include cuando se usa junto con la herencia.
Sin embargo, me sorprendió un poco que nadie mencionara el ssi proporcionada por el sistema de plantillas Django, que está diseñado específicamente para en línea incluyendo una pieza externa de texto. Aquí, en línea significa que el texto externo no se interpretará, analizará ni interpolará, sino que simplemente se “copiará” dentro de la plantilla de llamada.
Consulte la documentación para obtener más detalles (asegúrese de verificar su versión adecuada 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:
ssi Outputs the contents of a given file into the page. Like a simple include tag, {% ssi %} includes the contents of another file – which must be specified using an absolute path – in the current page
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.
-
Tenga en cuenta que, a partir de la versión 1.8, ssi ha quedado obsoleto en favor de Incluir. https://docs.djangoproject.com/en/1.8/ref/templates/builtins/#std:templatetag-include
– Tim S.
9 dic 2015 a las 23:55