2010-02-24 10 views
12

Mi amigo y yo estamos teniendo una pequeña discusión. En mi actual Proyecto Django, he creado un archivo llamado menu.html que contendrá un grupo de enlaces configurados y formateados en una lista. En vez de manualmente la codificación dura el menú en cada página, actualmente estoy incluyendo el menú usando el siguiente código de Django/Python:Django: ¿se extiende o incluye?

{% include 'menu.html' %} 

Sin embargo, mi amigo está sugiriendo que esta es la forma correcta de hacerlo. Dijo que necesito utilizar extiende en lugar de incluir y definir el contenido, algo como esto:

{% extend 'menu.html' %} 
{% block content %} 
The rest of my content here. 
{% endblock %} 

Eso es un poco de código extra. ¿Realmente importa cuál uso? Yo preferiría usar el anterior.

Respuesta

12

Sí, es importante. En primer lugar, extends solo puede aparecer como la primera línea del archivo. En segundo lugar, include empuja y aparece un objeto de contexto en la pila de resolución, lo que significa que el valor creado en el contexto mientras está en la inclusión saldrá del alcance cuando regrese.

Mi regla es: crear base.html archivos de plantilla que definen la estructura general de su sitio y usar cantidades liberales de {% block foo %} alrededor de áreas críticas. Luego, todas sus otras plantillas extends la base (o algo que amplíe la base) y reemplaza esos bloques según sea necesario.

include, por otro lado, es bueno para encapsular cosas que puede necesitar usar en más de un lugar, tal vez incluso en la misma página.

Actualización:

He estado usando mi propia biblioteca de template_tags durante tanto tiempo que olvidar que el lenguaje de plantillas de Django tiene todavía grandes lagunas en la funcionalidad. La etiqueta en cuestión aquí es de un fragmento de django anterior llamado expr que he editado y extendido en gran medida. Puede decir, por ejemplo, {% expr 'Fred' as name %} (o cualquier expresión de Python válida), y almacenará el resultado en el espacio "nombre" en el Contexto actual. Si esto ocurre en una plantilla included, el valor de name aparecerá al salir del archivo de la plantilla.

Puede lograrlo con la etiqueta {% with %}, pero expr me da mucha mayor flexibilidad, incluso haciendo llamadas arbitrariamente complejas. Esto surgió originalmente al tener que crear objetos complejos en caché que requerían costosas interacciones DBMS que no se podían completar en la vista, debían invocarse en la plantilla misma.

Envíame un correo electrónico (en mi perfil) si necesitas profundizar en esto.

+0

¿Podrías explicar esto con un ejemplo: 'el valor creado en el contexto mientras está en la inclusión saldrá del alcance cuando regrese' – Medorator

2

(su amigo)

Lo que en realidad quería decir era definir un base.html para que pueda heredar una plantilla base consistente de varias secciones genéricas, éste incluye el tipo de documento, el elemento HTML define a 3 cuadras de contenido y de navegación y opcional área para anular/insertar elementos guión/enlace en el encabezado.

<!doctype> 
<html> 
<head> 
{%block extrahead %} {%endblock %} 
</head> 
{%block nav %} 
<nav> 
    <ul> 
    <li>home</li> 
    </ul> 
</nav> 
<div id="content"> 
{% endblock %} 
{%block content %} 
{% endblock %} 
</div> 
</html> 

Entonces se puede definir homepage.html:

{% extends "base.html" %} 

{% block content %} 
homepage content 
{% endblock %} 

homepage.html tendría entonces la navegación, ya que se extiende base.html.

1

En este caso, colocar el menú en base.html y extender desde esto parece ser más sensato.

including es ideal para dividir plantillas complejas y reutilizar esos fragmentos.

digamos que utiliza el mismo estilo de lista en diferentes lugares del sitio, pero le envía otro queryset. siempre y cuando llame a los conjuntos de consultas de la misma manera, solo necesita escribir el código de la plantilla una vez.

Here Utilizo las plantillas diferentes para solicitudes normales y ajax. Pero usando incluir, déjame reutilizar la mayoría de las partes en ambas plantillas

Cuestiones relacionadas