2012-01-03 6 views
24

Diciamo che ho i tre file modello html mostrati di seguito. HTML è minimo solo per illustrare il punto.Il modello multi-livello di Django estende e nidifica i blocchi

È possibile in qualche modo annidare un blocco denominato extra_head_content all'interno di un blocco già denominato extra_head_content. L'idea è di consentire al modello di terzo livello di fornire un blocco denominato extra_head_content. Il modello sopra riportato prende quel contenuto, lo aggiunge al suo blocco denominato extra_head_content e fornisce questo blocco combinato al modello principale.

In sostanza, sto cercando l'annidamento di blocchi tra i file modello ereditati.

Lo scenario esatto che sto cercando di risolvere è che qualsiasi modello dovrebbe essere in grado di aggiungere file javascript o css extra all'elemento head. Tuttavia, il modello più basso non dovrebbe preoccuparsi di quanti livelli in basso è annidato. Allo stesso modo, il contenuto extra della testa fornito da un modello intermedio non dovrebbe essere sovrascritto dall'elemento di blocco del modello terminale.

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

risposta

49

No, ma è possibile utilizzare {{ block.super }}:

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

Il modulo django-sekizai prende cura di aggiunta al CSS e JavaScript con facilità:

#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 

Il sekazai docs chiarire le avvertenze per utilizzare questo sistema, vale a dire:

  1. render_block deve essere utilizzato solo all'esterno block tag
  2. render_block non può essere utilizzato nei modelli inclusi
  3. addtoblock deve essere utilizzato all'interno di tag di blocco quando utilizzato in un modello incluso
+1

django-sekizai è molto utile ... Ora non riesco a trovare alcun riferimento ad esso spedito con Django? AFAICT è ancora un modulo di terze parti – Anentropic

+0

Grazie per averlo raccolto! Sembra essere incluso in Django CMS 2.2 e versioni successive, ma attualmente non è Django, quindi ho corretto la mia risposta. –

Problemi correlati