- Formations
- conversion_path Parcours & Formations
- science Projets
- data_object Exercices de code
- psychology Exercices IA
- quiz Quiz
- Articles
- rss_feed Blog
- sort_by_alpha Glossaire
- menu_book Guides
- help_center FAQ
- media_link Ressources
- Communauté
- groups La communauté
- forum Questions
- live_tv Mentorats
- science Projets mensuels
- Formations
- conversion_path Parcours & Formations
- science Projets
- data_object Exercices de code
- psychology Exercices IA
- quiz Quiz
- Articles
- rss_feed Blog
- sort_by_alpha Glossaire
- menu_book Guides
- help_center FAQ
- media_link Ressources
- Communauté
- groups La communauté
- forum Questions
- live_tv Mentorats
- science Projets mensuels
Deviens membre Premium magic_button
Débloque cette session en devenant Membre Premium 🚀
Inscris-toi
(c'est gratuit !)
Un compte est nécessaire pour participer aux discussions.
Créer un compte personlive_helpToutes les questions
De716
10 mars 2024 - 10 mars 2024 à 13:07
checkConversation résolue
2 réponses
compréhension envoi BlogPostForm
Salut Thibault, j'ai une autre question de compréhension sur la partie utilisation du formulaire via `form_class`. Je t'ai cité ci-dessous (avec la transcription) car je n'ai pas saisi la différence …
De716
10 mars 2024 - 10 mars 2024 à 13:10
checkConversation résolue
3 réponses
comportement bizarre résolution url en fonction de l'ordre des url
Salut la team, j'ai eu un problème avec la résolution d'url de django pour accéder à la vue create-post => tout simplement impossible jusqu'à ce que j'inverse l'ordre des url …
Christian Aucane
27 décembre 2022 - 27 décembre 2022 à 18:05
checkConversation résolue
1 réponse
NoReverseMatch
Je me retrouve avec cette erreur quand je crée mon articleil apparait bien dans la base de donnée mais n'a pas de slug, donc pas de lien valide.Comment faire ?
00:00:00 :Dans cette vidéo, on va voir la classe CreateView qui est une classe qui nous permet de créer desobjets à l'intérieur de notre base de données, notamment grâce à un formulaire. Donc je pense
00:00:10 :que c'est vraiment là que vous allez comprendre l'intérêt des vues basées sur les classespuisqu'avec cette classe CreateView, vous allez voir qu'on a énormément de choses qui vont êtrefaites pour nous avec très peu de lignes de code. Et vous allez également voir que ça commence à
00:00:23 :devenir assez intéressant dans la façon dont les choses sont organisées par rapport à une vuebasée sur une fonction. Donc dans ce cas-ci, ici, j'ai dans urs.py, créé une URL donc blog
00:00:34 :slash create qui redirige vers cette vue, donc la vue blog post create, qui pour l'instant est unevue donc avec une fonction et on a cette fameuse structure conditionnelle à l'intérieur de cettevue qui me permet de vérifier le type de méthode qui est utilisée pour la requête. Donc on a soit
00:00:49 :une requête de type post dans laquelle je vais récupérer le formulaire avec les données envoyéespar l'utilisateur. On va ensuite vérifier si le formulaire est valide. Si c'est le cas, on va
00:00:59 :modifier quelques paramètres sur l'instance. Donc par exemple, on va dire que le published est égalà true et si on a un utilisateur qui est logué dans mon interface, je vais également mettrel'auteur de l'article à request.user. Ensuite, on sauvegarde le formulaire donc qui va avoir pour
00:01:13 :effet de sauvegarder notre modèle dans la base de données. Et pour finir, on redirige vers la vuede blog index, donc la vue d'index qu'on a ici avec tous les articles d'affichés. Si par contre,
00:01:24 :on a une requête de type get, donc là on va passer dans le else et on va tout simplementafficher un formulaire vide. Et dans create post ici, pour l'instant j'ai juste mon formulaire
00:01:32 :qui est affiché, donc le formulaire qui correspond à ce formulaire ici qui est un formulaire de typemodel form, donc qui va être automatiquement créé à partir de mon modèle blog post avec ces champsici, donc le titre, la description et le contenu. Donc si je me rends sur cette page ajouter un
00:01:46 :article, donc là j'ai un lien qui me permet d'aller sur blog slash create, là j'ai bien le titre,la description et le contenu, donc je peux mettre n'importe quoi ici. Je clique sur créer,
00:01:56 :je suis bien redirigé vers ma vue d'index, donc la vue d'accueil du blog. Et si je vais voir dansl'interface d'administration, ici j'ai bien un nouvel article avec publish qui est à true etl'auteur ici qui est tbash, puisque je suis actuellement logué sur le site avec tbash,donc avec mon utilisateur ici. Donc je vais supprimer cet article avant de continuer et
00:02:14 :maintenant je vais vous montrer comment on peut donc remplacer tout ça, donc avec la classecreate view. Donc dans views.py ici, juste après mes vues, donc la vue listview et detailview,
00:02:24 :je vais créer une autre classe qui va s'appeler dans ce cas-ci blog post create view et on vahériter donc de cette classe create view, donc create view qui est disponible dans django.views.generic.
00:02:36 :Vous l'avez ici, donc moi je l'ai déjà importé, donc importez-la si ce n'est pas fait et on vapouvoir donc créer notre classe ici. Alors la première chose qu'on va faire c'est comme pour
00:02:45 :les autres vues, donc de détails et de listes, indiquer le modèle sur lequel on souhaitetravailler. Donc on va dire que le modèle c'est le blog post. On va également spécifier le
00:02:54 :template que l'on souhaite utiliser, puisque par défaut il va aller chercher un template bienparticulier. Donc je vais vous montrer déjà ce que ça donne en mettant cette vue et on va voir
00:03:02 :l'erreur qu'on a, donc l'erreur template does not exist. Donc là à la place de blog post create,je mets blog post create view as view et on va importer cette classe ici, donc tout en haut,à la place de blog post create. Donc là si je reviens ici et que je clique sur ajouter un
00:03:15 :article, cette fois-ci on a donc improperly configured, donc on n'a pas l'erreur de template,dans ce cas-ci on a juste l'erreur en fait qui nous dit que les fields ne sont pas renseignés.
00:03:24 :Donc ça c'est dans ma vue ici, il va falloir renseigner les champs que l'on souhaite utiliserpour créer notre article. Donc je vais déjà mettre ça, je vais mettre fields et on va spécifier les
00:03:33 :fields que l'on souhaite utiliser pour la création de notre article. Donc dans ce cas-ci je vaisjuste mettre title et content pour vous montrer. Je reviens ici, j'actualise et là cette fois-ci on
00:03:42 :a bien donc l'erreur que je souhaitais avoir, donc l'erreur template does not exist puisquepar défaut vous voyez qu'il va donc aller chercher dans l'application, dans l'applicationblog, le nom du modèle avec tiré du bas form. Donc dans le cas d'une create view, c'est ce
00:03:55 :modèle qui va chercher donc le nom du modèle en minuscule avec tiré du bas form à la fin. Moij'ai déjà mon fichier ici create post.html, donc je vais spécifier là encore grâce à template name
00:04:05 :que je souhaite utiliser à la place ce template. Donc on va mettre template name et on va direque c'est égal à blog slash create post.html. Donc je reviens ici, j'actualise et là j'ai bien
00:04:17 :mon formulaire qui s'affiche avec dans ce cas-ci uniquement le titre et le contenu. Donc si on vavoir ici dans create post, on a mon formulaire qui est affiché et le formulaire si vous voussouvenez bien il est créé à partir de ce formulaire dans forms.py qui contient le titre,
00:04:31 :la description et le contenu. Donc vous voyez que même si dans mon formulaire j'ai souhaité avoirla description, si par contre dans ma vue basée sur la classe, donc sur cette classe ici, je luidis que les champs ce sont juste title et content que je souhaite afficher, et bien là vous voyez
00:04:45 :que je n'ai pas la description qui est affichée. Donc c'est vraiment ce champ ici qui va avoirprécédence sur ce qu'on a indiqué ici à l'intérieur de notre formulaire. On pourrait
00:04:54 :également très bien mettre un formulaire sans passer par un formulaire modèle form comme ona ici. Je vais mettre un formulaire classique comme ceci, donc sans passer par le forms.py,
00:05:03 :sans passer par ce blog post form, mais directement en utilisant un input, donc un input pour le texte.On a title ici et content. Donc ça peut très bien marcher comme ceci, si vous n'êtes pas obligé de
00:05:13 :passer par un formulaire. Et là si j'actualise ma page, j'ai bien ici le titre et le contenu et jepeux créer un article de cette façon. Donc je vais vous montrer ce que ça donne. Je vais mettre
00:05:22 :ici un super article, un super article, on va mettre le même contenu. Je clique sur créer unarticle et là vous voyez qu'automatiquement, c'est un peu magique, on est directement redirigé versla page de l'article en question. Donc là on est dans blog slash un super article et mon article a
00:05:38 :été créé. Si je vais voir dans la base de données, j'actualise, j'ai bien un super article. Pourl'instant il n'est pas publié et on n'a pas d'auteur. Et si je vais voir sur l'article ici,
00:05:46 :on n'a pas non plus de description, on a vraiment juste ce que l'on a mis à l'intérieur de notreformulaire. Donc là vous voyez qu'en plus avec mon formulaire, j'ai été automatiquement redirigé
00:05:56 :vers la page de l'article. Donc ça c'est un mécanisme qui est normal avec la vue basée surla classe, donc la vue create view. Et vous voyez que déjà qu'on a pas mal de choses qui se mettent
00:06:05 :en place. On a automatiquement le formulaire qui est envoyé, notre modèle qui est créé dans labase de données et notre redirection qui se fait. Donc vous voyez c'est exactement ce que je vous
00:06:14 :disais au début de cette vidéo. Là on a trois choses qui sont faites automatiquement. On a déjàl'affichage du formulaire, ensuite on a la création de notre modèle grâce au formulaire dans la basede données et la redirection qui sont faites. Donc on a presque tout ce qui est là dans ces
00:06:29 :lignes de code qui est fait uniquement avec ces quatre lignes ici. Donc vous voyez qu'il y abeaucoup de choses qui sont faites pour nous et rassurez-vous ça ne veut pas dire qu'on ne peutpas modifier là encore pas mal de choses. On peut notamment bien entendu modifier l'URL de redirection
00:06:42 :donc pour par exemple rediriger vers le sommaire du blog et on peut bien entendu modifier leformulaire avant qu'il soit envoyé. Donc ce que je vais faire ici c'est déjà envoyer mon formulaire
00:06:52 :puisque là actuellement j'ai remis ici en fait du html directement et moi j'aimerais bien envoyermon formulaire ici donc le formulaire blog post form. Donc ce que je vais faire c'est que dans
00:07:02 :ma vue ici donc dans ma classe je vais indiquer pour l'attribut form class que je souhaite utiliserblog post form. Donc là bien entendu il faut également l'importer donc là tout en haut je l'ai
00:07:12 :importé from blog.forms import blog post form. Donc ce formulaire ici je l'ai créé dans lefichier forms.py qui est à l'intérieur de mon dossier blog donc le dossier de l'application
00:07:22 :pour mon blog. Donc j'importe le formulaire et ici je vais spécifier donc à cette vue donc à blogpost create view que je souhaite utiliser ce formulaire à l'intérieur de ma vue donc àl'intérieur de mon fichier html. Donc là dans ce cas-ci c'est bien ce formulaire qui va être
00:07:36 :utilisé et si je reviens sur la page pour ajouter un article vous allez voir qu'on a une erreurpuisqu'on ne peut pas avoir à la fois les champs qui sont spécifiés et les formulaires. Là vous
00:07:45 :voyez que j'avais mis fields avec le titre et le contenu donc soit vous spécifiez les champs àutiliser soit vous spécifiez un formulaire à utiliser. Donc là je vais enlever les champs et
00:07:54 :c'est exactement ce que nous dit cette erreur on ne peut pas avoir à la fois les fields et leform class qui sont spécifiés dans notre classe. Donc j'actualise et là vous voyez que ça fonctionne
00:08:03 :et cette fois-ci j'ai bien mon formulaire qui est utilisé. Donc si dans mon formulaire je rajoutepar exemple published vous allez voir qu'automatiquement on va retrouver la checkboxpour spécifier si on souhaite ou non publier notre article de blog. Donc je reload la page ici
00:08:17 :et là j'ai bien ma checkbox qui apparaît. Donc on est bien en train d'utiliser ce formulaire ici etje vais pouvoir donc modifier ce formulaire grâce à une méthode qui est la méthode formValid.
00:08:27 :Donc cette méthode je vais la créer ici donc on va faire def formValid vous voyez queautomatiquement PyCharm la reconnaît et on a un premier paramètre form ici qui va récupérer leformulaire qui est envoyé automatiquement par cette classe. Et là on a bien l'indication ici
00:08:42 :donc qui nous dit qu'on est en train d'overrider donc de surcharger une méthode qui est définied'un modèle formMixin. Donc là on récupère le formulaire et pour l'instant je ne vais faire
00:08:52 :aucun changement je vais juste faire un return et on va utiliser super pour appeler donc formValidet passer le formulaire. Donc là on ne fait rien on fait juste définir formValid et on retourne
00:09:02 :l'appel de formValid sur super donc sur notre classe createView en lui passant le formulaire.L'intérêt c'est qu'ici on va pouvoir donc modifier notre formulaire avant de le retourner.
00:09:11 :Donc ce qu'on va faire c'est qu'on va faire exactement ce que l'on avait ici donc danscette partie là dans laquelle on changeait le published à true et dans laquelle on vérifiaitsi un utilisateur a été logué sur le site. Donc je vais faire tout ça ici je vais faire
00:09:24 :if self.request.user.isAuthenticated donc self.request ça nous permet d'avoir accès à larequête donc c'est exactement ce que l'on a ici quand on a une vue basée sur une fonction on ala requête. Dans la classe on va avoir self.request qui nous permet d'accéder à la requête.
00:09:41 :Ensuite sur cette requête on a un utilisateur et on va pouvoir vérifier s'il est connecté surmon site. Si c'est le cas et bien je vais modifier l'instance du formulaire donc je
00:09:51 :vais faire form.instance. Instance ici nous permet de récupérer l'instance qui est associée à ceformulaire donc l'instance du blog post et on va dire que author est égal à self.request.user
00:10:03 :et à la suite on va dire que form.instance.published est égal à true. Donc vous voyez que on faitjuste modifier notre formulaire et ensuite on le retourne à cette méthode form.valide avec
00:10:15 :super. Donc tout ça ça va me permettre quand je vais créer un nouvel article donc là je vaisactualiser pour vous montrer donc là on a le titre, la description, le contenu, je mets n'importequoi, je clique sur créer et on a bien notre article qui est créé et si je vais voir cette
00:10:29 :fois-ci donc dans ma base de données je vais retourner sur les articles là on voit que cettefois-ci l'article est bien publié automatiquement et que l'auteur est bien tibach. Donc là vous
00:10:37 :voyez qu'on vient de recréer en fait tout ce qu'on avait ici, on n'a pas besoin non plus demettre le form.isvalide puisque là en fait cette méthode est appelée si le formulaire est valide
00:10:46 :donc on n'a pas besoin de faire une vérification supplémentaire pour vérifier si le formulaire estvalide puisque quand on passe dans cette vue ça veut dire qu'il est valide. On va pouvoir également
00:10:54 :comme je vous ai dit modifier l'url de redirection pour l'instant on est redirigé vers l'article quel'on vient de créer mais nous on souhaiterait par exemple revenir sur la vue du sommaire. Alors
00:11:04 :pour ça on peut modifier l'attribut successurl et on va tout simplement mettre ici le reverse lazydonc attention il faut pas utiliser reverse puisque à ce moment en fait quand on va définirnotre classe on n'aura pas la résolution des url qui aura été effectuée. Donc si vous essayez
00:11:20 :d'utiliser reverse vous allez avoir une erreur un peu difficile à déchiffrer je vais vous montrer.Donc reverse il est disponible dans django.urls donc depuis django.urls j'ai importé reverse
00:11:31 :lazy et reverse on verra reverse lazy dans un instant pour l'instant je vais juste mettrereverse et vous allez voir que si donc on ajoute un article donc là encore je vais mettre n'importequoi je clique sur créer et là ça ne fonctionne plus. Et si on va dans le run vous allez voir
00:11:44 :qu'on a cette erreur ici qui nous dit que l'urlconf de website.urls ne semble pas avoiren fait de patterns à l'intérieur donc ne semble pas avoir ce fameux url patterns qui permet dedéfinir des url. Donc ça en fait c'est une erreur qui est assez déroutante pour les débutants et
00:11:59 :c'est vraiment parce que vous ne pouvez pas utiliser reverse à ce moment là comme on n'apas encore eu la résolution d'url. Donc dans ce cas ci il faut utiliser reverse lazy et là ça
00:12:06 :va fonctionner. Une autre façon de faire c'est de modifier en fait la méthode qui permet derécupérer le successurl donc cette méthode c'est get successurl et on va donc la modifier pourretourner ici cette fois ci le reverse de blogindex. Donc blogindex qui est une chaîne
00:12:23 :de caractère qui est en fait le nom de mon index ici donc le nom que j'ai donné à cette url. Donclà dans ce cas ci si on passe par la méthode get successurl dans ce cas ci on peut utiliser reverseet non pas reverse lazy donc c'est vraiment deux façons de faire la même chose soit vous
00:12:37 :spécifiez l'attribut ici avec reverse lazy soit vous modifiez get successurl. Donc je vais vousmontrer avec ça on va essayer de recréer un article donc je clique sur créer alors je vaisactualiser la page alors je vais en fait relancer mon serveur puisque là j'avais une erreur doncon relance le serveur on revient sur cette vue je vais mettre n'importe quoi là encore je clique
00:12:55 :sur créer et là on retourne bien au niveau de ma page d'accueil. Donc on a bien une redirectionqui est faite après le poste donc là on a le poste qui permet de envoyer en fait les donnéesde mon formulaire et de créer mon article donc on voit bien l'article ici qui est ajouté et ensuite
00:13:09 :on a bien cette redirection avec le 302 ici qui nous redirige vers la page de blog. Donc là encorec'est exactement la même chose que ce qu'on faisait dans notre vue ici où on retournaitun http response redirect avec le reverse vers le blogindex. Donc voilà pour toute cette partie
00:13:23 :c'était assez long mais il y avait pas mal de choses à vous montrer il y avait donc toute lapartie formulaire, toute la partie modification du formulaire et là donc vous voyez vraiment qu'ona beaucoup de choses qui sont faites automatiquement par Django. Juste en spécifiant le formulaire
00:13:36 :ici on a le formulaire qui est automatiquement récupéré avec les bonnes informations qui sontenvoyées, l'article qui est créé donc on n'a vraiment pas besoin de faire tout ce qu'on faisaitici c'est à dire récupérer le formulaire, lui envoyer les données, vérifier si on avait uneméthode poste, faire la vérification avec le isValid, modifier les choses bon ça on le fait
Ce n'est pas fini...
✋
Tu as complété % du parcours 🔥
Termine l'intégralité de la formation pour pouvoir débloquer ton attestation de réussite.