Django - Sistema di modelli
Django rende possibile separare python e HTML, il python va nelle viste e l'HTML va nei modelli. Per collegare i due, Django si affida alla funzione di rendering e al linguaggio Django Template.
La funzione di rendering
Questa funzione accetta tre parametri:
Request - La richiesta iniziale.
The path to the template - Questo è il percorso relativo all'opzione TEMPLATE_DIRS nelle variabili del progetto settings.py.
Dictionary of parameters- Un dizionario che contiene tutte le variabili necessarie nel modello. Questa variabile può essere creata oppure è possibile utilizzare locals () per passare tutte le variabili locali dichiarate nella vista.
Django Template Language (DTL)
Il motore di modelli di Django offre un mini-linguaggio per definire il livello dell'applicazione rivolto all'utente.
Visualizzazione delle variabili
Una variabile ha questo aspetto: {{variabile}}. Il modello sostituisce la variabile con la variabile inviata dalla vista nel terzo parametro della funzione di rendering. Cambiamo il nostro hello.html per visualizzare la data odierna -
hello.html
<html>
<body>
Hello World!!!<p>Today is {{today}}</p>
</body>
</html>
Quindi la nostra visione cambierà in -
def hello(request):
today = datetime.datetime.now().date()
return render(request, "hello.html", {"today" : today})
Ora otterremo il seguente output dopo aver accesso all'URL / myapp / hello -
Hello World!!!
Today is Sept. 11, 2015
Come probabilmente avrai notato, se la variabile non è una stringa, Django utilizzerà il metodo __str__ per visualizzarla; e con lo stesso principio puoi accedere a un attributo oggetto proprio come lo fai in Python. Ad esempio: se volessimo visualizzare la data dell'anno, la mia variabile sarebbe: {{today.year}}.
Filtri
Ti aiutano a modificare le variabili al momento della visualizzazione. La struttura dei filtri è simile alla seguente: {{var | filters}}.
Some examples -
{{string|truncatewords:80}} - Questo filtro troncerà la stringa, quindi vedrai solo le prime 80 parole.
{{string|lower}} - Converte la stringa in minuscolo.
{{string|escape|linebreaks}} - Esegue l'escape del contenuto della stringa, quindi converte le interruzioni di riga in tag.
È inoltre possibile impostare il valore predefinito per una variabile.
Tag
I tag consentono di eseguire le seguenti operazioni: if condition, for loop, template inheritance e altro.
Tag if
Proprio come in Python puoi usare if, else ed elif nel tuo modello -
<html>
<body>
Hello World!!!<p>Today is {{today}}</p>
We are
{% if today.day == 1 %}
the first day of month.
{% elif today.day == 30 %}
the last day of month.
{% else %}
I don't know.
{%endif%}
</body>
</html>
In questo nuovo modello, a seconda della data del giorno, il modello restituirà un certo valore.
Etichetta per
Proprio come "if", abbiamo il tag "for", che funziona esattamente come in Python. Cambiamo la nostra vista ciao per trasmettere un elenco al nostro modello -
def hello(request):
today = datetime.datetime.now().date()
daysOfWeek = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
return render(request, "hello.html", {"today" : today, "days_of_week" : daysOfWeek})
Il modello per visualizzare l'elenco utilizzando {{for}} -
<html>
<body>
Hello World!!!<p>Today is {{today}}</p>
We are
{% if today.day == 1 %}
the first day of month.
{% elif today.day == 30 %}
the last day of month.
{% else %}
I don't know.
{%endif%}
<p>
{% for day in days_of_week %}
{{day}}
</p>
{% endfor %}
</body>
</html>
E dovremmo ottenere qualcosa come -
Hello World!!!
Today is Sept. 11, 2015
We are I don't know.
Mon
Tue
Wed
Thu
Fri
Sat
Sun
Blocca ed estendi i tag
Un sistema di modelli non può essere completo senza ereditarietà del modello. Significa che quando stai progettando i tuoi modelli, dovresti avere un modello principale con buchi che il modello del bambino riempirà secondo le sue esigenze, come una pagina potrebbe aver bisogno di un CSS speciale per la scheda selezionata.
Cambiamo il modello hello.html in modo che erediti da main_template.html.
main_template.html
<html>
<head>
<title>
{% block title %}Page Title{% endblock %}
</title>
</head>
<body>
{% block content %}
Body content
{% endblock %}
</body>
</html>
hello.html
{% extends "main_template.html" %}
{% block title %}My Hello Page{% endblock %}
{% block content %}
Hello World!!!<p>Today is {{today}}</p>
We are
{% if today.day == 1 %}
the first day of month.
{% elif today.day == 30 %}
the last day of month.
{% else %}
I don't know.
{%endif%}
<p>
{% for day in days_of_week %}
{{day}}
</p>
{% endfor %}
{% endblock %}
Nell'esempio sopra, chiamando / miaapp / ciao otterremo comunque lo stesso risultato di prima, ma ora ci basiamo su estensioni e blocchi per il refactoring del nostro codice -
Nel main_template.html definiamo i blocchi utilizzando il tag block. Il blocco del titolo conterrà il titolo della pagina e il blocco del contenuto avrà il contenuto principale della pagina. In home.html usiamo extends per ereditare da main_template.html quindi riempiamo il blocco definito sopra (contenuto e titolo).
Tag commento
Il tag di commento aiuta a definire i commenti in modelli, non commenti HTML, non appariranno nella pagina HTML. Può essere utile per la documentazione o semplicemente per commentare una riga di codice.