Open AminaM2 opened 4 years ago
À présent, nous aimerions pouvoir voir, ajouter, modifier et supprimer des polls à partir de l’application web en tant qu’usagers ordinaires. N’oublions pas que seuls les administrateurs peuvent accéder à l’interface utilisateur admin de Django et que le shell n’est pas convivial.
Pour cela, commençons par créer le formulaire qui permettra de créer une nouvelle instance de Poll:
Maintenant que nos formulaires sont faits, on peut créer nos vues. Il existe 2 types de vues dans Django:
Au final, toute vue est une fonction qui prend en paramètres une requête HTTP et retourne une réponse HTTP. Pour cette démo, j’ai choisi de vous montrer uniquement les class based views. L’inconvénient avec les function based views, c’est qu’il faut souvent répéter les mêmes bouts de code alors que les class based views regroupent ces portions de code dans des classes génériques. Les class based views ne remplacent pas les function based views et ne sont pas la solution optimale dans le cas de besoins complexes, mais dans le cas d’un simple CRUD, elles sont l’idéal (exemple de function based view dans l’app accounts) car elles permettent de structurer vos vues et de réutiliser du code en exploitant l’héritage et les « mixins ». Il vous suffit de surcharger ses attributs (comme template_name) ou ses méthodes (comme get_context_data).
La première classe servira à afficher une liste de nos objets polls et héritera donc de la classe générique ListView. Pour cette classe, le seul attribut que l’on aura besoin de définir sera model. Je surchargerai également la variable template_name, mais cela est optionnel (par défaut, le nom du template sera
À présent, la seule chose qu’il nous manque pour que notre page soit visible par les utilisateurs:
Les paramètres à spécifier sont :
Tout est prêt maintenant! Si l’on rentre l’url localhost:8000/polls, on sera redirigé vers une page blanche, étant donné que l’on n’a rien affiché dans notre template. Si on retourne dans le template en question, on va pouvoir commencer à découvrir quelques-uns des template tags que Django propose pour l’affichage des résultats.
Après cette petite parenthèse sur les templates, revenons à notre fichier views.py pour ajouter une vue de détail qui affichera l’information spécifique à un poll.
Créons donc une class based view qui hérite de DetailView (après l’avoir importée bien sûr). Comme pour la vue précédente, je vais redéfinir la variable template_name et je vais tout de suite aller créer mon template que j’appellerais poll_detail.html sous tempaltes/polls, comme le template précédent. Il va lui aussi étendre de base.html et redéfinir le bloc content, qui ne contiendra rien pour le moment.
Puis, retournons dans le fichier urls.py de l’app. Ajoutons un nouveau pattern. Ce qui va différer par rapport à l’url précédente, c’est le premier paramètre. En effet, à présent, nous devons passer dans l’url l’id de l’objet (car nous désirons afficher les détails d’un objet en particulier), donc nous allons ajouter entre les guillemets des chevrons. À l’intérieur des chevrons, nous allons spécifier le type du paramètre (int dans notre cas), suivi de :, puis du nom du paramètre (pk est le nom que Django à recevoir du côté de la vue, il est possible de le changer, mais cela impliquera l’ajout de quelques lignes de code. Nous allons donc garder pk)
Il est aussi possible de passer une slug à la place d’un id. Un slug est une courte étiquette pour quelque chose, contenant uniquement des lettres, des chiffres, des traits de soulignement ou des tirets. Il suffit d’ajouter un field slug de type models.SlugField(), puis de définir dans le fichier urls, au lieu d’un int, un slug et au lieu de pk, slug. (plus significatif qu’un id et cache l’id)
À présent, dans notre template, on peut afficher les informations de l’objet passé en contexte. Le nom de cette variable sera object. Affichons donc tous les attributs de cette variable.
**À noter que si c’est le titre du livre qui s’affiche lorsque l’on imprime l’attribut book, c’est parce que dans la classe modèle Book, nous avons redéfini la fonction __str__
À présent, nous voudrions faire le lien entre la page qui permet d’afficher tous les polls et la page de détail d’un poll. Pour cela, nous allons retourner dans le template poll_list.html. Nous allons ajouter un lien (balise html ) qui va nous rediriger vers la page de détail. L’attribut href pointera sur object.get_absolute_url, qui est une méthode que nous devons redéfinir dans la classe modèle. C’est également l’occasion d’introduire le tag url qui permet de rediriger l’utilisateur vers l’url spécifiée en paramètres. C’est donc pour éviter de hardcoder des urls que l’on créera la méthode get_absolute_url. Aussi, il est intéressant de noter qu’à plusieurs endroits, Django va chercher une méthode appelée get_absolute_url dans votre modèle. C’est le cas entre autres lorsque vous utilisez une CreateView sans spécifier de sucess_url. Par défaut, Django vous redirigera vers l’objet nouvellement créé en utilisant la méthode get_absolute_url. La méthode get_absolute_url se sert de la méthode reverse () pour référencer cette URL en utilisant le nom de l’url, spécifié dans le fichier urls.py.
Créons maintenant une vue pour créer de nouveaux polls. Comme pour les deux vues précédentes, on va hériter de la vue générique appropriée, CreateView dans notre cas. On va redéfinir template_name et form_class, une variable pour laquelle on doit spécifier le formulaire à utiliser.
Puis, dans le dossier templates, sous polls, on va créer un fichier poll_create.html. Ce template va recevoir dans le contexte une variable form qui contiendra tous les champs du formulaire.
Et voilà, vous avez un formulaire présentable en quelques minutes seulement!
Il existe aussi une DeleteView et une UpdateView que nous ne passerons pas en revue, mais vous pouvez regarder le fichier views.py d’une autre app si la syntaxe vous intéresse.
Étapes de réalisation de l'atelier 03