2009-01-02 20 views
16

Me pregunto si alguien me puede ayudar a encontrar el mejor enfoque para el siguiente problema. Estoy construyendo una aplicación web que utiliza plantillas de Django para construir su componente de interfaz de usuario web. Hay una serie de elementos HTML comunes, como el encabezado/pie de página, el encabezado HTML, el encabezado, etc. Me gustaría codificarlos una vez e "incluirlos/combinarlos" con otras plantillas que representen la funcionalidad de la aplicación principal.Combinación de varias plantillas de Django en una sola solicitud

¿Esto es posible usando las plantillas de Django? Si es así, ¿cómo podría lograrlo?

Respuesta

35

Puede utilizar la etiqueta de Django extends. Supongamos que tiene un encabezado y un pie de página. Se podría hacer una plantilla, llamada, por ejemplo, foo.django:

<h1>My HTML Header</h1> 
<!-- an so on --> 

{% block content %} 
{% endblock %} 

<!-- html footer --> 

A continuación, puede hacer otra plantilla, por ejemplo, bar.django:

{% extends "foo.django" %} 

{% block content %} 
This overrides the content block in foo.django. 
{% endblock %} 

... que luego render:

<h1>My HTML Header</h1> 
<!-- an so on --> 

This overrides the content block in foo.django. 

<!-- html footer --> 

Hay buenas instrucciones sobre las plantillas de Django en http://www.djangobook.com/en/1.0/chapter04/.

12

Los métodos {% extends %} y {% include %} son adecuados para elementos de página que no necesitan información adicional en el contexto.

Tan pronto como necesite insertar más elementos en el contexto de la base de datos, las etiquetas de plantilla son útiles. Como ejemplo, el contrib.comments app incluido con Django define una etiqueta de plantilla {% get_comment_list %} para recuperar los comentarios adjuntos a una instancia de modelo determinada. He aquí cómo usted lo utilizaría:

<div> 
{% load comments %} 
{% get_comment_list for my_instance as comment_list %} 
{% for comment in comment_list %} 
    <p><a href="{{ comment.url }}">{{ comment.name }}</a> wrote:</p> 
    {{ comment.comment }} 
{% endfor %} 
</div> 

Se podría guardar esta en una plantilla separada y {% include %} en otras plantillas.

Para su propio contenido, puede escribir sus propias etiquetas de plantilla personalizadas. Siga the documentation. Siempre que sea posible, es conveniente escribir etiquetas utilizando el mecanismo simple tag. Encontrará etiquetas de plantilla listas para usar en djangosnippets.org y blogosphere.

Cuestiones relacionadas