template - Plantilla Django multinivel se extiende y anida bloques.
render django (2)
El módulo django-sekizai se encarga de la adición a css y javascript con facilidad:
#base.html
{% load sekizai_tags %}
# define your template, declaring blocks for inheriting templates:
{% block content %}
{% endblock content %}
# at the bottom of the body:
{% render_block "js" %}
</body>
</html>
#my_template.html
{% extends "base.html" %}
{% load sekizai_tags %}
{% block content %}
# content goes here...
# so does the addtoblock tag
{% addtoblock "js" %}
<script src="my/awesome/script.js"></script>
{% endaddtoblock %}
{% endblock content %}
# Note no addtoblock tags outside the block-endblock tags
Los documentos de Sekazai aclaran las advertencias para el uso de este sistema, a saber:
- render_block solo debe usarse fuera de las etiquetas de bloque
- render_block no se puede utilizar en las plantillas incluidas
- addtoblock debe usarse dentro de las etiquetas de bloque cuando se usa en una plantilla incluida
Digamos que tengo los tres archivos de plantilla html que se muestran a continuación. HTML es mínimo solo para ilustrar el punto.
¿Es posible anidar de alguna manera un bloque denominado extra_head_content dentro de un bloque que ya se llama extra_head_content? La idea es permitir que la plantilla de tercer nivel proporcione un bloque denominado extra_head_content. La plantilla de arriba toma ese contenido, lo agrega a su bloque denominado extra_head_content y proporciona este bloque combinado a su plantilla principal.
Esencialmente, estoy buscando el anidamiento de bloques en los archivos de plantilla heredados.
El escenario exacto que estoy tratando de resolver es que cualquier plantilla debería poder agregar archivos javascript o css adicionales al elemento principal. Sin embargo, a la plantilla más baja no debería importarle cuántos niveles hacia abajo está anidado. De forma similar, el elemento de bloque de la plantilla de terminal no debe sobrescribir el contenido de encabezado adicional proporcionado por una plantilla intermedia.
base.html
<html>
<head>
<link rel="stylesheet" type="text/css" href="/static/css/reset.css" />
{% block extra_head_content %}{% endblock %}
</head>
<body>{% block content %}{% endblock %}
</html>
account.html
{% extends "base.html" %}
{% block extra_head_content %}
<link rel="stylesheet" type="text/css" href="/static/css/account.css" />
{% block extra_head_content %}{% endblock %}
{% endblock %}
{% block content %}
<div id="menu">...</div>
{% block account_content %}{% endblock %}
{% endblock %}
account_profile.html
{% extends "account.html" %}
{% block extra_head_content %}
<link rel="stylesheet" type="text/css" href="/static/css/edit_profile.css" />
{% endblock %}
{% block account_content %}
Welcome to your profile
{% endblock %}
No, pero puedes usar {{ block.super }}
:
{% block extra_head_content %}
{{ block.super }}
<link rel="stylesheet" type="text/css" href="/static/css/account.css" />
{% endblock %}