XVIII. Données dynamiques dans les templates▲
Nous avons différents morceaux en place : le modèle Post qui est défini dans le fichier models.py, la vue post_list dans views.py et nous venons de créer notre template. Mais comment allons-nous faire pour faire apparaître nos articles dans notre template HTML ? Car finalement, n'est-ce pas le but que nous souhaiterions atteindre ? Nous aimerions prendre du contenu, en l'occurrence notre modèle sauvegardé dans notre base de données, et réussir à joliment l'afficher dans notre template.
C'est à ça que servent les vues : connecter les modèles et les templates. Dans notre vue post_list, nous allons avoir besoin de prendre les modèles dont nous avons besoin et de les passer au template. Concrètement, c'est dans la vue que nous allons décider ce qui va s'afficher (modèle) dans un template.
OK, et sinon, on fait comment ?
Nous allons avoir besoin d'ouvrir le fichier blog/views.py. Pour l'instant, la vue post_list ressemble à ceci :
2.
3.
4.
from
django.shortcuts import
render
def
post_list
(
request):
return
render
(
request, 'blog/post_list.html'
, {})
Est-ce que vous vous souvenez de comment rajouter des morceaux de code écrits dans d'autres fichiers ? Nous en avons parlé dans un chapitre précédent. Nous allons devoir importer notre modèle qui est défini dans le fichier models.py. Pour cela, nous allons ajouter la ligne from .models import Post de la façon suivante :
from
django.shortcuts import
render
from
.models import
Post
Le point après from signifie le dossier courant ou l'application courante. Comme views.py et models.py sont dans le même dossier, nous pouvons tout simplement utiliser . et le nom du fichier, sans le .py. Ensuite, nous importons le modèle (Post).
OK, et après ? Afin de pouvoir aller chercher les véritables articles de blog de notre modèle Post, nous avons besoin de quelque chose qui s'appelle un QuerySet.
XVIII-A. QuerySet▲
Normalement, ce mot doit vous évoquer quelque chose. Nous en avons un peu parlé dans la section Django ORM (QuerySets)Django ORM (Querysets).
Maintenant, nous allons nous intéresser à une liste d'articles qui sont publiés et classés par date de publication (published_date). Ça tombe bien, on a déjà fait ça dans la section sur les QuerySets !
Post.objects.filter(
published_date__lte=
timezone.now
(
)).order_by
(
'published_date'
)
Il ne nous reste plus qu'à mettre cette ligne de code à l'intérieur de notre fichier blog/views.py, dans la fonction def post_list(request) :
2.
3.
4.
5.
6.
7.
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'
, {})
Veuillez noter que nous créons une variable pour notre QuerySet : posts. Considérez que c'est le nom de notre QuerySet. À partir de maintenant, nous allons pouvoir faire référence à notre QuerySet en utilisant ce nom.
Notez aussi que notre code utilise la fonction timezone.now() et que, par conséquent, nous allons aussi devoir importer timezone.
Il nous manque encore un petit quelque chose : passer notre QuerySet posts à notre template. Nous nous intéresserons plus particulièrement à celui-ci dans la section suivante.
Dans la fonction render, nous avons déjà un paramètre request, qui désigne tout ce que nous recevons d'un utilisateur par l'intermédiaire d'Internet, et un fichier template appelé 'blog/post_list.html'
. Le dernier paramètre, qui ressemble à {}, va nous permettre de glisser des instructions que notre template va suivre. Nous avons besoin par exemple de lui donner des noms : nous allons rester sur 'posts'
pour le moment. Ça va ressembler à ça : {'posts'
: posts}. La partie située avant: est une chaîne de caractères : vous devez donc l'entourer de guillemets ''.
Finalement, notre fichier blog/views.py doit maintenant ressembler à ceci:
2.
3.
4.
5.
6.
7.
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})
Et voilà, c'est bon ! Nous allons retourner du côté de notre template pour que notre QuerySet puisse s'afficher correctement !
Si vous voulez en savoir plus sur les QuerySets, n'hésitez pas à consulter la documentation officielle du framework : https://docs.djangoproject.com/fr/1.10/ref/models/querysets/