AminaM2 / demo-django

Projet séminaire
0 stars 0 forks source link

Atelier 03 #3

Open AminaM2 opened 4 years ago

AminaM2 commented 4 years ago

Étapes de réalisation de l'atelier 03

AminaM2 commented 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:

  1. Créez un fichier forms.py à la racine de votre app polls. Django nous fournit une classe ModelForm qui permet de créer un formulaire à partir d’un modèle. C’est ce que nous allons faire.
  2. Tout d’abord, la classe Meta nous permet de dire à Django quel modèle il doit utiliser pour créer ce formulaire.
  3. Puis, il faut spécifier les champs (fields) que nous désirons voir apparaître dans notre formulaire. Si la réponse est tous, on rentre la chaîne ‘_all_’. Dans le cas de Poll, on va exclure le field poller, car ce sera le créateur du poll qui sera le poller par défaut. À savoir qu'il est possible de spécifier un label pour le field et d'ajouter des précisions sur les widgets que l'on veut voir s'afficher (ex: le nombre de rangées et de colonnes de notre textarea)

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 _list.html). Supposons par contre que nous ne voulions pas afficher tous les polls qui se trouvent dans la base de données, mais seulement ceux qui sont actifs. Dans ce cas-là, il nous faudra redéfinir la variable queryset et filtrer les résultats pour n’obtenir que les polls actifs.

À présent, la seule chose qu’il nous manque pour que notre page soit visible par les utilisateurs:

  1. Créer un gabarit ou template (par défaut Django va chercher ce gabarit dans : templates//_list.html). On va mettre ce gabarit dans l’app polls étant donné qu’il permet d’afficher la liste des polls. Mais vous pourriez tout aussi bien le mettre à la racine de n’importe quelle app, il s’agit simplement de respecter le path que Django s’attend à rencontrer. Si vous voulez spécifier un nouveau path, il suffit d’overrider la variable template_name, ce que nous allons faire.
  2. Puis, il faut mapper la vue que l’on veut créer avec un pattern d’url. Allons donc dans le fichier urls.py à la racine de l’app portant le nom du projet. Il s’agit du fichier de configuration que Django va consulter en premier. Ce que nous voulons, c’est rediriger toutes les requêtes pour lesquelles l’url commence par polls vers notre app polls. Il suffit ensuite de spécifier include(`polls.urls`) qui est le fichier que nous allons créer à l’instant pour contenir les urls qui se rapportent aux polls. Donc, on retourne à la racine de notre app polls et on créer un fichier urls.py. J’importe la vue que je viens de créer et la fonction path fournie par Django pour router les URL vers les vues appropriées.

    Les paramètres à spécifier sont :