2012-01-03 16 views
24

Digamos que tengo los tres archivos de plantilla html que se muestran a continuación. HTML es mínimo solo para ilustrar el punto.La plantilla de varios niveles Django se extiende y los bloques anidados

¿Es posible anidar de algún modo un bloque llamado extra_head_content dentro de un bloque ya llamado extra_head_content. La idea es permitir que la plantilla de tercer nivel proporcione un bloque llamado extra_head_content. La plantilla de arriba toma ese contenido, lo agrega a su bloque llamado extra_head_content y proporciona este bloque combinado a su plantilla principal.

Básicamente, estoy buscando la jerarquización de bloques en 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 importar cuántos niveles anidados está anidada. De manera similar, el contenido de cabecera adicional proporcionado por una plantilla intermedia no debe sobreescribirse por el elemento de bloque de la plantilla de terminal.

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 %} 

Respuesta

49

No, pero se puede usar {{ block.super }}:

{% block extra_head_content %} 
    {{ block.super }} 
    <link rel="stylesheet" type="text/css" href="/static/css/account.css" /> 
{% endblock %} 
2

El módulo django-sekizai se encarga de 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 

El sekazai docs dejar en claro las advertencias para el uso de este sistema, a saber, que:

  1. render_block sólo debe ser utilizado fuera etiquetas de bloqueo
  2. render_block no se puede utilizar en plantillas incluidas
  3. addtoblock se debe utilizar dentro de las etiquetas de bloque cuando se utiliza en una plantilla incluida
+1

django-sekizai es muy útil ... ¿No puedo encontrar ninguna referencia a que se envíe con Django ahora? AFAICT sigue siendo un módulo de terceros – Anentropic

+0

¡Gracias por elegirlo! Parece estar incluido en Django CMS 2.2 y posterior, pero no en Django en este momento, por lo que he corregido mi respuesta. –

Cuestiones relacionadas