Come abbiamo accennato i Tag servono per gestire il controllo di flusso della costruzione della pagina a seconda delle informazioni ricevute dalla View. Oltre a questo vedremo alcune altre funzionalità molto potenti di questo strumento.
La sintassi tipica di un Tag è questa:
{% tag %} ... contenuto ... {% endtag %}
Alcuni tag generano output, altri sono utilizzati per eseguire cicli e istruzioni condizionali. Esaminiamo i principali tag predefiniti.
Il ciclo for ci permette la classica iterazione sugli array.
Esempio di ciclo for
<ul> {% for contatto in lista_contatti %} <li> {{ contatto.nome }} </li> {% endfor %} </ul>
Il costrutto if/else, ci permette di effettuare un rendering condizionale della pagina.
{% if lista_contatti %} Numero di contatti in rubrica: {{ lista_contatti|length }} {% else %} Non ci sono contatti in rubrica. {% endif %}
ifequal/ifnotequal, verifica l'uguaglianza degli argomenti.
{% ifequal contatto.nome "Fabio" %}
<!-- contenuto ... -->
{% endifequal %}
block e extends, definiscono l'ereditarietà tra template, cioé un template estende un template base, ridefinendo le sezioni block.
Nei template si possono inserire dei commenti, indicati con {# .... #}
.
Vediamo ora un esempio che mostra i concetti presentati. Definiamo il template base.html
che utilizziamo come contenitore principale e il template esempio_templ.html
, in cui visualizziamo una particolare View; il secondo estende il primo.
base.html
<html> <head> <title>{% block titolo %} Titolo {% endblock %}</title> </head> <body> {% block contenuto %} Contenuto {% endblock %} </body> </html>
Vediamo come estendere ed effettuare l'override dei blocchi del template base:
esempio_templ.html
{% extends "base.html" %} {% block title %}{{ sezione.titolo }}{% endblock %} {% block content %} <h1>{{ sezione.titolo }}</h1> {% for item in variabile %} <h2> <a href="{{ item.get_absolute_url }}"> {{ item.descrizione }} </a> </h2> <p>{{ item.info|truncatewords:"30" }}</p> {% endfor %} {% endblock %}
In pratica il tag extends
indica il template radice. Il tag block
definisce un blocco nel template base (si può considerare come un segnaposto) e lo stesso tag nel template foglia definisce il contenuto per il blocco. Ogni blocco è definito dal nome del blocco che lo deve identificare univocamente.
Vediamo ora come utilizzare i template in una View. Una View che utilizza un template deve contenere l'invocazione della funzione render_to_response
a cui deve essere passato il template da utlizzare e un dizionario contenente le variabili utilizzate nel template.
Ad esempio, il template esempio_templ.html
può essere utilizzato dalla View miavista()
nel modo seguente:
def miavista(request):
# ...
return render_to_response("esempio_templ.html", {'sezione':{'titolo':...}, variabile: []})
I templates devono essere memorizzati in una cartella del progetto, ad esempio miosito/templates
e bisogna aggiungere tale directory alla variabile TEMPLATE_DIRS
definita nel file miosito/settings.py
.