Pregunta

Me gustaría proporcionar el mismo contenido dentro de 2 archivos base diferentes.

Así que 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 ambas extensiones e incluir. ¿Hay alguna manera de hacer eso? Y si no, ¿cómo puedo lograr lo anterior?

commondata.html anula un bloque que se especifica tanto en base1.html como en base2.html

El propósito de esto es proporcionar la misma página en formato pdf y html, donde el formato es ligeramente diferente. Aunque la pregunta anterior simplifica lo que estoy tratando de hacer, si puedo obtener una respuesta a eso, resolverá mi problema.

¿Fue útil?

Solución

Cuando usas la etiqueta de plantilla extendida, estás diciendo que la plantilla actual se extiende a otra, que es una plantilla secundaria, que depende de una plantilla principal. Django examinará su plantilla secundaria y usará su contenido para completar el elemento primario.

Todo lo que quieras usar en una plantilla secundaria debe estar dentro de bloques, que Django usa para rellenar el elemento primario. Si desea usar una declaración de inclusión en esa plantilla secundaria, debe ponerla 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-herencia

Otros consejos

De los documentos de Django:

  

La etiqueta de inclusión debe considerarse como una implementación de "representar este subtemplate e incluir el HTML", no como "analizar este subtemplate" 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.

Por lo tanto, Django no toma ningún bloque de su commondata.html y no sabe qué hacer con los bloques html representados fuera.

Esto debería hacer el truco por ti: coloca la etiqueta de inclusión dentro de una sección de bloque.

page1.html:

{% extends "base1.html" %}

{% block foo %}
   {% include "commondata.html" %}
{% endblock %}

page2.html:

{% extends "base2.html" %}

{% block bar %}
   {% include "commondata.html" %}
{% endblock %}

Más información acerca de por qué no me funcionó en caso de que ayude a las personas futuras:

La razón por la que no funcionó es que a {% include%} en django no le gustan los caracteres especiales como el elegante apóstrofe. La plantilla de datos que estaba tratando de incluir estaba pegada desde word. Tuve que eliminar manualmente todos estos caracteres especiales y luego se incluyó correctamente.

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 :

  

{% 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 de plantilla, Django usará ese objeto como plantilla principal.

En lugar de " page1.html " y " page2.html " ;, ponga {% extended base_template%} en la parte superior de " commondata.html " ;. Y luego, en su opinión, defina base_template como " base1.html " o " base2.html " ;.

Agregado para referencia a futuras personas que lo encuentren a través de google: es posible que desee ver la etiqueta {% overextend%} proporcionada por la biblioteca intermedia para casos como este.

Edita el 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 en desuso y se eliminará en Django 1.10. Utilice la etiqueta de inclusión en su lugar.


En mi opinión, la respuesta correcta (mejor) a esta pregunta es la de podshumok , ya que explica por qué el comportamiento de incluir 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 Django, que está diseñada específicamente para en línea e incluye una pieza externa de texto . 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.

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:

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 ALLOWED_INCLUDE_ROOTS requerida, que debe agregarse a sus archivos de configuración.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top