2010-12-31 7 views
41

Al configurar mi proyecto y trabajar para mantener las aplicaciones no dependientes, me he encontrado con un problema. Me gustaría que todas las plantillas de las diferentes aplicaciones tengan un encabezado y un pie de página consistentes. Esto es lo que estoy intentando:django incluye plantilla de otra aplicación

myproject/ 
     base/ 
      templates/ 
         header.html 
         footer.html 
     app1/ 
      templates/ 
         my_app1_page.html -> want to include 'header.html' 
              and 'footer.html' from base app 

Supongo que hay muchas más aplicaciones que también quieren hacer esto. ¿Es esto posible y/o la forma correcta de hacerlo?

Respuesta

73

Mientras las aplicaciones están en INSTALLED_APPS y se habilita el cargador de plantillas para aplicaciones de directorios, puede incluir cualquier plantilla de otra aplicación, es decir:

{% include "header.html" %} 

... ya que las plantillas se encuentran directamente en el directorio de plantillas de tu aplicación general, con el fin de evitar conflictos de nombre, es mejor utilizar:

app1/ 
    templates/ 
     app1/ 
      page1.html 
      page2.html 
app2/ 
    templates/ 
     app2/ 
      page1.html 
      page2.html 

Y {% include "app1/page1.html" %} o {% include "app2/page1.html" %} ...

Pero: para mantener una apariencia consistente, es mucho mejor para usar la herencia de la plantilla en lugar de la inclusión. La herencia de la plantilla es una de las cosas realmente buenas del sistema de plantillas de Django, elija herencia sobre inclusión siempre que tenga sentido (la mayoría de las veces).

Mis recomendaciones:

  • tiene una plantilla de base para su proyecto ("base.html" es la convención por defecto) con el encabezado y el pie y una {%block content%} para su página principal.
  • en tus otras plantillas heredan forma base.html {% extends "base.html" %} y anulan la sección de contenido

Ver otra respuesta a esta pregunta por vínculos con el doc

+1

alto y claro, esa es la respuesta que estaba buscando. – Scott

9

Si bien puede hacer eso usando el include tag y especificando rutas absolutas, la forma correcta de trabajar en Django es usando Template inheritance.

+1

1 plantilla de herencia –

+0

¿Y si tengo algún modelo y plantilla parcial para representar ese modelo, por ejemplo dirección, evento? Creo que esa inclusión tiene sentido en tal escenario. – quapka

Cuestiones relacionadas