DY

07 Les vues

Nous allons voir sur cette page comment écrire des contrôleurs (views) puissants très simplement en Django, sous la forme de fonctions : un contrôleur = une fonction. Tout simplement !

Écriture de nos contrôleurs (views)

Nous devons écrire deux vues qui correspondent à nos deux routes définis précédement.

Import des modèles de l'application

Bien entendu, nos contrôleurs (views) vont avoir besoin de nos modèles : nous allons commencer par les importer dans le fichier views.py.

games_review/views.py

from games_review.models import Game, Type
Écriture du contrôleur (vue) accueil

OK, nous sommes maintenant prêts pour écrire un premier contrôleur (view). Notre contrôleur (view) dashboard doit récupérer les jeux pour pouvoir invoquer ensuite une vue (template) qui les affichera à l'écran. Voici sa déclaration :

games_review/views.py

def index(request):
    games = Games.objects.all()
    return render(request, 'index.html', {'latests_games': games})

Nous avons déclaré une simple fonction index(), qui reçoit automatiquement un paramètre request. Ce paramètre est fourni par Django au moment de l'appel de la fonction en provenance du contrôleur frontal, et comprend tout ce dont on peut avoir besoin concernant la requête de l'utilisateur (les paramètres get, post, etc.).

La dernière ligne de la fonction utilise un raccourci (shortcut) permettant de créer l'objet HttpResponse à partir de différents éléments :

Relancez les tests. Les deux tests sont toujours en erreur.

Si vous essayez d'accéder à l'url 127.0.0.1:8000 vous risquez de rencontrer une exception du type TemplateDoesNotExist.

Pour éviter cette erreur, créons simplement un répertoire templates dans le dossier de notre application games_review. Dans ce répertoire, créons deux fichiers vides (pour le moment) : index.html et game.html.

Si vous essayez d'accéder à l'url 127.0.0.1:8000, plus de soucis de template inexistant à présent, c'est assez épuré, mais ça fonctionne.

Par contre notre test toujours pas.

Écriture du contrôleur (vue) game

games_review/views.py

def game(request, slug):
    game = get_object_or_404(Game, slug=slug)
    return render(request, 'game.html', {'game': game})

Rien de bien nouveau ici, si ce n'est que nous souhaitons récupérer un jeu donné, repéré par un slug.

Autre remarque : nous utilisons ici une fonction pratique (« shortcut », une sorte de raccourcis…) nommée get_object_or_404 : cette fonction tente de récupérer un enregistrement sur la base d'une contrainte (ici sur le champ slug : slug=game_slug) et retourne un code 404 si l'objet est introuvable. Pratique !

Idem si nous relançons nos test ceux-ci échouent toujours ! Pour ce faire il faut maintenant modifier nos templates!

Conclusion

Nous avons vu dans ce tutoriel assez dense comment créer des contrôleurs (views) avec Django, en utilisant les function-based views. Nos deux contrôleurs sont regroupés dans un seul fichier views.py, et sont très courts.

Nous allons voir dans le prochain tp comment créer les templates (autrement dit, les « vues » au sens MVC) pour afficher des choses !