2012-01-27 10 views
10

I tienen la siguiente:Sobreescritura un bloque dentro de una `plantilla include`d partir de una plantilla extendida

base.html

<html> 
    {% include 'header.html' %} 
    <div> 
    {% block content %}Default Content{% endblock %} 
    </div> 
</html> 

header.html

<header> 
    {% block logo %}Logo 1{% endblock %} 
</header> 

homepage.html

{% extend 'base.html' %} 
{% block logo %}Logo 2{% endblock %} 
{% block content %}Yap Yap Yap{% endblock %} 

Básicamente, esto no funciona. Cuando me hacen la homepage.html me sale:

<html> 
    <header>Logo 1</header> 
    <div>Yap Yap Yap</div> 
</html> 

pero si muevo el código en header.html en base.html (es decir, deshacerse de la include en total) funciona bien. ¿Alguien puede explicar por qué este es el caso?

Tengo la sensación de que tiene algo que ver con las plantillas included que se muestran después de que se hayan procesado sus padres.

Respuesta

9

from the docs

La etiqueta include debe ser considerada como una implementación de "hacer que esta subtemplate e incluir el código HTML", no como "analizar esta subtemplate e incluir su contenido como si fuera parte de los padres" . 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 que el subtemplate (header.html) está siendo representado completamente y se inserta en la plantilla padre (base.html), es decir, no existe el concepto del bloque de la plantilla de niño (homepage.html) para sobrescribir

0

No es posible sobrescribir el logotipo de homepage.html porque no está definido en la plantilla base.

La solución es, como usted propone, para mover el código header.html en base.html

5

Esto es una limitación conocida que esperamos ser resuelto en un futuro próximo.

Dicho sea de paso, suponiendo que tiene un problema más complejo que ha mencionado, otra solución para esto es convertir el encabezado en un bloque y reemplazar este bloque con una nueva inclusión personalizada.

base.html

<html> 
    {% block header %} 
     {% include 'header.html' %} 
    {% endblock %} 
    <div> 
     {% block content %}Default Content{% endblock %} 
    </div> 
</html> 

header.html

<header> 
    {% block logo %}Logo 1{% endblock %} 
</header> 

página de inicio.html

{% extends 'base.html' %} 

{% block header %} 
    {% include 'homepage_header.html' %} 
{% endblock %} 

{% block content %}Yap Yap Yap{% endblock %} 

homepage_header.html

{% extends 'header.html' %} 

{% block logo %}Logo 2{% endblock %} 
1

que tenía un problema similar. Tengo una plantilla de tabla filtrada que es de forma

{% extends 'base.html' %} 
{% include 'filtered_table.html' %} 

donde filtered_table.html es:

{% load render_table from django_tables2 %} 
<div class="panel-body" > 
    <form method='GET'> 
    <div class="search-form" style="border: 1px solid #000000; background-color:#a3ffaf; overflow: auto;"> 
{% block render_form %} 
    {% for field in filter.form %} 
     {{ field.errors }} 
     {{ field.label_tag }} {{ field }} 
    {% endfor %} 
{% endblock %} 
    <input type='submit' value='Filter' /> 
    | 
    Displaying {{ filter.qs.count }} of {{ filter.queryset.count }} {{ object_name }}s. 
    | 
    <a href='{{ request.path }}' >Clear</a> <p> 
    </div> 

{% if table %} 
    {% render_table table %} 
{% endif %} 

</form> 

</div> 

I puede desear especialmente hand-craft la forma, por ejemplo, deletreando cada campo como este :

{% block render_form %} 
{{ filter.form.field1.errors }} 
{{ filter.form.field1.label_tag }} 
{{ filter.form.field1 }} 
<p> 

{{ filter.form.field2.errors }} 
{{ filter.form.field2.label_tag }} 
{{ filter.form.field2 }} 
{% endblock %} 

Por desgracia, porque no puedo hacer "se extiende" dos veces, no puedo obtener mi diseño de la base y personalizar la tabla filtrada. Entonces, la forma fea (porque rompe la estructura HTML por la mitad) de hacer esto es simplemente definir comenzar_tabla_filtrada.html y end_filtered_table.html. Luego, en el caso personalizado Tengo dos envolver incluye la personalización, y para el caso no personalizada, filtered_form.html se define así:

{% include "begin_filtered_table.html" %} 

    {% for field in filter.form %} 
     {{ field.errors }} 
     {{ field.label_tag }} {{ field }} 
    {% endfor %} 

{% include "end_filtered_table.html" %} 

Esto resuelve el problema a costa de ser grave. Sería mucho más fácil simplemente permitir extensiones múltiples.

Cuestiones relacionadas