para - django: usar bloques en plantillas incluidas
django templates bootstrap (4)
Tengo algunas estructuras html que se reutilizan en bastantes lugares diferentes. Es diferente de una plantilla general, así que no puedo extenderla, también puede usarse para contener contenido complicado, por lo que no creo que definirlo como una etiqueta de plantilla sea un buen trabajo. A continuación se muestra un pseudo código que describe mi resultado deseado, cuando se usa template_level2.html puedes poner fácilmente cosas en reutilizable_pattern_template llamando al bloque dentro de él. Si utilizo este código, lo que escriba en ''contenido real'' de template_level_2.html no se mostrará. ¿Cómo debería lidiar con esto?
base.html
<html>
<head></head>
<body>
{% block content %}{% endblock %}
</body>
</html>
template_level1.html
{% extends ''base.html'' %}
{% block content %}
Something here...
{% include ''reusable_pattern_template.html'' %}
Something else here...
{% endblock %}
reutilizable_pattern_template.html
<div>
<div>
<div>
{% block local_content %}{% endblock %}
</div>
</div>
</div>
template_level2.html
{% extends ''template_level1.html'' %}
{% block local_content %}
Actual content here...
{% endblock %}
actualización: Lo sentimos, el extends en template_level2.html tiene errores ortográficos, lo he corregido.
Puede que no esté muy claro, pero el código anterior es más un pseudo código que describe mi resultado deseado. En breve,
- Me gustaría incluir pequeños trozos de patrones html reutilizables en mis plantillas.
- Estos patrones son como cuadros, que puede poner piezas enteras de contenido html en ellos. Entonces las variables de contexto pueden ser un poco demasiado limitadas para mi propósito
Django no procesa bloques en archivos incluidos.
La etiqueta de inclusión se debe considerar como una implementación de "renderizar esta subtabla e incluir el HTML", no como "analizar esta subcompetencia e incluir su contenido como si fuera parte de la matriz". Esto significa que no hay un estado compartido entre las plantillas incluidas; cada inclusión es un proceso de representación completamente independiente. ( Documentación de la etiqueta de la plantilla de Django )
Me encontré con este problema y terminé con el siguiente compromiso, esperando que alguien más lo encuentre útil. Se basa en el uso with
bloques en las plantillas secundarias.
base.html quiere reutilizar un include nav.html común, pero define algunos bloques donde las plantillas secundarias pueden sobrescribir las variables dentro de nav.html .
<!-- base.html: -->
<html>
[...]
<nav class="desktop">
{% block desktop_nav %}
{% include "includes/nav.html" %}
{% endblock %}
</nav>
[...]
<nav class="mobile">
{% block mobile_nav %}
{% include "includes/nav.html" %}
{% endblock %}
</nav>
[...]
La plantilla de inclusión depende de una variable llamada selected
, que base.html no define, por defecto:
<!--includes/nav.html:-->
<a href="/about/" class="{% if selected == ''about'' %}selected{% endif %}">About</a>
<a href="/people/" class="{% if selected == ''people'' %}selected{% endif %}">People</a>
<a href="/contact/" class="{% if selected == ''contact'' %}selected{% endif %}">Contact</a>
Pero las páginas secundarias pueden anular ese valor de la siguiente manera:
<!--about.html:-->
{% extends "base.html" %}
{% block desktop_nav %}{% with selected=''about'' %}{{ block.super }}{% endwith %}{% endblock %}
{% block mobile_nav %}{% with selected=''about'' %}{{ block.super }}{% endwith %}{% endblock %}
Entonces, no es perfecto, aún tengo que tener dos bloques separados y usarlos with
bloques dos veces, pero me permite anular las variables en include
bloques de la plantilla principal.
Parece que la plantilla final está tratando de extenderse (si estaba entre comillas) .
Realmente no necesitas mucha complejidad. En realidad es mucho más simple.
La plantilla base debe contener el esqueleto de su plantilla, luego puede ampliarla para realizar personalizaciones. Para los bloques de códigos reutilizables que no desea incluir en todas sus vistas, include
cuando corresponda, pero no use ninguna instrucción de block
, extends
o include
dentro del archivo incluido. Django no los analizará, pero la context variable
pasada desde la vista todavía se puede usar.
Puede dividir reutilizable_pattern_template en plantillas de inicio y fin. Luego, en el nivel 1 puedes ir incluir comenzar, bloquear e incluir el final.
Alternativamente, podría pasar un nombre de plantilla en reutilizable_pattern_template como una variable de contexto y luego incluirlo en reutilizable_pattern_template. Esto requerirá cambiar la relación entre level1 y level2 en su ejemplo, pero generalmente es más poderoso.