I dati dinamici nei templates
Abbiamo diversi pezzi: il modello Post
è definito in models.py
, abbiamo post_list
nel file views.py
ed abbiamo aggiunto il template. Ma come faremo a far comparire i nostri post nel nostro template HTML? Perché è quello che vogliamo: prendere qualche contenuto (modelli salvati nel database) e farlo vedere in modo carino nel nostro template, giusto?
Questo è esattamente quello che le views dovrebbero fare: collegare i modelli ed i template. Nella nostra post_list
view avremo bisogno di prendere i modelli che vogliamo far vedere e passarli nel template. Nella view decidiamo cosa (modello) renderemo visibile nel template.
OK, quindi come facciamo a farlo?
Dobbiamo aprire il nostro blog/views.py
. Per ora post_list
view si vede così:
blog/views.py
from django.shortcuts import render
def post_list(request):
return render(request, 'blog/post_list.html', {})
Ricordi quando abbiamo parlato di includere codice scritto in diversi file? Ora è il momento di includere il model che abbiamo scritto in models.py
. Aggiungeremo questa riga from .models import Post
così:
blog/views.py
from django.shortcuts import render
from .models import Post
Il punto prima di models
significa directory attuale oppure applicazione attuale. Sia views.py
che models.py
sono nella stessa cartella. Questo significa che possiamo usare .
seguito dal nome del file (senza .py
). Allora importiamo il nome del modello (Post
).
Cos'altro bisogna fare? Per poter prendere i post del blog dal modelloPost
ci serve una cosa chiamata QuerySet
.
QuerySet
Dovresti già sapere come funziona QuerySet. Ne abbiamo parlato nel capitolo Django ORM (QuerySets) .
Quindi ora vogliamo i post del blog che sono pubblicati ordinati per published_date
, giusto? Lo abbiamo già fatto nel capitolo sulle QuerySet!
blog/views.py
Post.objects.filter(published_date__lte=timezone.now()).order_by('published_date')
Quindi, apriamo il file blog/views.py
nell'editor del codice, e aggiungiamo questo codice alla funzione def post_list(request)
-- ma non dimenticare di aggiungere prima da django.utils import timezone
:
blog/views.py
from django.shortcuts import render
from django.utils import timezone
from .models import Post
def post_list(request):
posts = Post.objects.filter(published_date__lte=timezone.now()).order_by('published_date')
return render(request, 'blog/post_list.html', {})
Per mostrare il nostro QuerySet sull'elenco dei post del nostro blog, ci sono rimaste due cose da fare:
- Passare il QuerySet dei
post
al contesto del modello, modificando la chiamata della funzione dirender
: Lo faremo adesso. - Modifica il modello per visualizzare il QuerySet dei
post
. Copriremo ciò in un capitolo successivo.
Nota che abbiamo creato una variabile per il nostro QuerySet: posts
. Vedila come il nome del nostro QuerySet. Da qui in avanti possiamo riferirci ad esso con questo nome.
Nella funzione render
abbiamo già un parametro con request
(quindi tutto quello che riceviamo dal nostro utente via internet) e un file template 'blog/post_list.html'
). Nell'ultimo parametro, che è simile a questo: {}
possiamo aggiungere cose che il template possa utilizzare. Dobbiamo dargli un nome (ci atterremo a 'posts'
per il momento). :) Si vede così: {'posts': posts}
. Ti preghiamo di notare che la parte prima di :
è una stringa; devi metterla tra virgolette.
Finalmente il nostro file blog/views.py
dovrebbe essere così:
blog/views.py
from django.shortcuts import render
from django.utils import timezone
from .models import Post
def post_list(request):
posts = Post.objects.filter(published_date__lte=timezone.now()).order_by('published_date')
return render(request, 'blog/post_list.html', {'posts': posts})
E' tutto! Ora di tornare al nostro template e rendere visibile questo QuerySet!
Vuoi leggere un poco di più su QuerySets in Django? Dovresti guardare qui: https://docs.djangoproject.com/en/2.2/ref/models/querysets/