variable template for examples bootstrap python django django-templates django-inheritance

python - for - import django template



Plantillas Django: anulando bloques de plantillas infantiles incluidas a través de una plantilla extendida (3)

Parece poco conocido que puede usar la palabra clave with con la include para pasar variables al contexto de una plantilla incluida; puede usarla para especificar las inclusión en la plantilla incluida:

# base.html <html> <body> {% block header %}{% include "header.html" %}{% endblock %} </body> </html> # header.html # some stuff here <div id="header"> <img src="logo.png"> {% include nav_tmpl|default:"navigation.html" %} </div> # special_page.html (uses other navigation) {% extends "base.html" %} {% block header %} {% include "header.html" with nav_tmpl="special_nav.html" %} # you might also want to wrap the include in an ''if'' tag if you don''t want anything # included here per default {% endblock %}

Este enfoque le evita al menos tener un archivo adicional con el único propósito de sobrescribir un bloque. También puede usar la palabra clave with para pasar un valor a través de una jerarquía mayor de inclusión también.

Me pregunto si alguien sabe cómo lidiar con la siguiente estructura de plantilla peculiar:

### base.html <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"> <html lang="en"> <head> <title> {% block title %} Title of the page {% endblock %} </title> </head> <body> <header> {% block header %} {% include "base/header.html" %} {% endblock header %} </header> {% block content %}{% endblock %} </body> </html>

### base/header.html <div id="menu-bar"> {% block nav %} {% include "base/nav.html" %} {% endblock %} </div>

### base/nav.html <nav id="menu"> <ul> <li> <a href="/profile/">My Profile</a> </li> <li> <a href="/favs/">My Favorites</a> </li> {% block extra-content %}{% endblock %} </ul> </nav>

Y, el corazón del asunto:

### app/somepage.html {% extends "base.html" %} {% block content %} <p>Content is overridden!</p> {% endblock %} {% block extra-content %} <p>This will not show up, though...</p> {% endblock %} {% block nav %} <p>Not even this.</p> {% endblock %}

El problema es que al extender una plantilla solo puede anular los bloques declarados solo en el elemento primario, no en ninguno de sus elementos secundarios.

Supongo que podría hacer base.html una capa de bloques anidados vacíos no utilizados que cubren todas las contingencias futuras, pero ¿eso incluso lo anularía correctamente? ¿Y es esa la única manera?

Si se pregunta por qué tengo un flujo de trabajo de inclusión / extensión bidireccional alrededor de base.html, tengo muchas sub-plantillas que quiero que se utilicen en todo el proyecto: encabezados, pies de página, navegadores, barras laterales, etc. tendrá una estructura consistente en todo el sitio, pero en muchos casos una subdivisión completa del sitio solo necesitará algunas de esas sub-plantillas. Mi idea fue definir las sub-plantillas bajo la carpeta templates / base, y tener templates / base-type1.html, templates / base-type2.html, etc. para extender en otros lugares. Cada tipo solo haría referencia a las sub-plantillas necesarias, y las anularía para colocar el contenido según sea necesario.


Puede resolver esto extendiendo sus plantillas incluidas actualmente, y luego incluyendo la extensión en lugar de la plantilla base incluida actualmente.


Una variante de la solución propuesta por @Bernhard Vallant :

# base.html <html> <body> {% block header %}{% include "header.html" %}{% endblock %} </body> </html> # header.html # some stuff here <div id="header"> <img src="logo.png"> {% include nav_tmpl|default:"navigation.html" %} </div> # special_page.html (uses other navigation) {% extends "base.html" %} {% block header %} {% with nav_tmpl="special_nav.html" %} {{ block.super }} {% endwith %} {% endblock %}