Bien démarrer avec les vues

Effectué

En programmation, une vue est généralement un composant qui affiche des informations pour l’utilisateur. Les tâches qu’une vue effectue peuvent varier en fonction du framework et des conventions, y compris de la responsabilité du chargement des données.

Dans Django, une vue est généralement chargée des opérations suivantes :

  • La validation de la demande d’un utilisateur.
  • Le chargement ou la modification des données appropriées.
  • Le renvoi d’un gabarit HTML avec les informations pour l’utilisateur.

Nous allons commencer notre exploration en expliquant comment créer manuellement des vues et configurer les URLconfs appropriés. Un URLconf est une liste de chemins qui indiquent le gabarit à suivre, la fonction à appeler et éventuellement un nom (facultatif). Dans une prochaine unité, nous verrons comment Django peut gérer automatiquement une partie du code que nous avons écrit à la main.

Créer une vue

En général, pour créer une vue de toutes pièces dans Django, vous devez créer une fonction. Cette fonction contient généralement le code approprié pour :

  • Exécuter la tâche demandée par l’utilisateur.
  • Retourner un gabarit contenant les données devant être affichées pour l’utilisateur.

Les fonctions de vue prennent toujours au moins un paramètre nommé request, qui représente la demande de l’utilisateur. Vous pouvez fournir d’autres paramètres en fonction des besoins si vous souhaitez obtenir plus d’informations de la part de l’utilisateur dans l’URL, comme le nom ou l’ID d’un élément. Vous les inscrirez lors de la création de la route, que nous aborderons plus tard dans cette unité.

Chargement des données

Vous pouvez utiliser l’ORM Django pour charger les données dont vous avez besoin à partir de la base de données inscrite.

Le projet que nous créons comprend deux gabarits : Shelter et Dog. Nous pouvons charger tous les objets ou exécuter d’autres requêtes à l’aide des gabarits que nous avons créés. Pour charger tous les refuges, par exemple, nous utiliserons Shelter.objects.all(). Nous pouvons charger un seul refuge à l’aide de Shelter.objects.get(pk=1).

Notes

pk est un raccourci pour la clé primaire. Vous pouvez utiliser id et obtenir le même résultat. Cependant, l’utilisation de pk garantit que la commande fonctionnera si vous avez changé le nom de la propriété qui représente la clé primaire.

Erreurs 404

Dans les applications web, l’erreur 404 signifie qu’un objet est « introuvable ». Dans ce cas, une meilleure pratique consiste à retourner une erreur 404 chaque fois qu’une demande est effectuée pour un objet qui n’existe pas.

Django fournit des raccourcis pour le chargement des données :

  • get_object_or_404 et get_list_or_404 : chargent un objet selon une clé primaire, ou retourne une erreur 404 si l’objet est introuvable.
  • get_list_or_404 : effectue la même opération que l’autre raccourci, sauf qu’il accepte un paramètre de filtre.

Nous allons utiliser get_object_or_404 dans notre exercice.

Affichage du gabarit

Le moteur de gabarit Django prend le gabarit HTML que nous créons, le combine avec toutes les données que nous fournissons et émet le code HTML pour le navigateur. La fonction d’assistance pour effectuer cette tâche est render.

La fonction render a besoin de l’objet qui représente la requête, c’est-à-dire le paramètre request dont nous avons parlé précédemment. Vous passez également le nom du gabarit, qui correspond généralement à un fichier HTML situé dans un dossier nommé templates.

Pour passer des données dans le gabarit, vous devez fournir à render un objet de dictionnaire context. L’objet context contient un ensemble de paires clé/valeur, où chaque clé devient une variable du gabarit.

Exemple

Pour créer une vue permettant de lister tous les refuges, vous pouvez utiliser le code suivant :

def shelter_list(request):
    shelters = Shelter.objects.all()
    context = { 'shelters': shelters }
    return render(request, 'shelter_list.html', context)

Inscrire un chemin

Quasiment tous les frameworks web utilisent des chemins pour traiter les demandes des utilisateurs. Les chemins convertissent la partie de l’URL qui se situe entre le nom du domaine et la chaîne de requête (qui vient après le point d’interrogation) dans un appel de fonction.

Un appel à www.contoso.com/shelters peut appeler une fonction pour lister tous les refuges, alors que www.contoso.com/shelters/1 peut appeler une fonction pour afficher le refuge dont l’ID est 1. Vous inscrivez les chemins dans Django en créant un URLconf.

Supposons que nous ayons un module appelé views, ce qui est une convention Django. Nous pouvons router le trafic d’index quand aucun chemin n’est spécifié (par exemple, www.contoso.com) vers une fonction dans views appelée index, et lui attribuer le nom index, en utilisant le chemin suivant :

path('', views.index, 'index')

Nous pouvons également créer des dossiers virtuels pour des demandes spécifiques. Par exemple, si nous voulions lister tous les refuges pour une demande /shelters, nous pourrions utiliser la commande suivante :

path('shelters', views.shelter_list, 'shelter_list')

Paramètres d’URL

Il est courant de passer des paramètres à une application dans le cadre de l’URL, par exemple un ID ou un nom. Étant donné que ces valeurs seront amenées à changer, nous ne devons pas les coder en dur dans notre chemin. Dans Django, vous pouvez spécifier un paramètre à l’aide d’une syntaxe spéciale. Dans cette syntaxe, vous pouvez indiquer le type de données que vous attendez (par exemple, un entier) et un nom.

Par exemple, si vous souhaitez créer un chemin pour qu’un utilisateur puisse demander un refuge spécifique à l’aide d’un ID, il vous faut un paramètre de type integer (la raison en est que notre clé primaire est un entier). Vous pouvez ensuite fournir le nom que vous souhaitez utiliser pour la variable, qui sera ensuite passé en tant que paramètre à la fonction de vue. La syntaxe permettant d’identifier ce paramètre est <int:pk>. Notez la déclaration de type, le signe deux-points, puis le nom de la variable.

Le chemin complet peut se présenter de la façon suivante :

path('shelter/<int:pk>', views.shelter_detail, name='shelter_detail')

La fonction de vue associée aurait la signature suivante :

def shelter_detail(request, pk):
    # code

La partie pk de la signature du chemin est passée en tant que paramètre shelter_detail, exactement comme si nous appelions une fonction Python normale.