Session du 07 juin 2024 à 19h00
Développement Web & Frameworks
Django et les formulaires
Introduction à la gestion des formulaires avec Django :
-
Passer assez vite sur crispy forms (librairie indispensable )
-
Surcharge des méthodes clean et init
-
Petit passage sur les transactions atomiques (ça va bien avec les forms quand on a besoin de créer plusieurs instances de différents modèles)
Si on a le temps, google recaptcha dans les forms.
00:00:36 :Alors déjà pour commencer on va aller ici. La doc elle est super bien foutue et en plus elle est en français.Du coup pour les formulaires en fait avec Wagtail il y a un truc que je voulais vous montrer.
00:01:01 :Donc voilà en général un formulaire en HTML vous allez utiliser la valise form et mettre vos labels, input, ça c'est tout de suite.Est-ce que le back-end est plus difficile ? C'est-à-dire est-ce que tu peux juste détailler un petit peu le back-end ?
00:01:20 :Je continue et je relis ton message après.Et du coup avec le Django ce que vous pouvez faire c'est que vous n'avez pas besoin de créer de label et d'input, vous faites tout en fait en Python.
00:01:56 :Je vais directement aller dans le projet.Donc par exemple ce que j'ai fait, tu vas voir le back-end là justement on va en parler au niveau des validations.
00:02:14 :Mais au niveau back-end oui les formulaires ça peut paraître un petit peu compliqué quand on commence.Moi perso quand j'ai commencé Django ça a été un point le plus chiant où il fallait que je revienne dessus tout le temps parce que je galérais à chaque fois.
00:02:27 :Mais au final quand on s'y fait après c'est vraiment extra.Donc j'ai fait un projet test comme ça, bon il n'y a rien c'est tout bidon mais vous allez voir c'est juste pour les exemples.
00:02:39 :Ce que j'ai fait dans le projet, dans les settings il n'y a rien de fou, vous allez voir j'ai rien de spécial.Est-ce qu'il faut que je zoom ou c'est bon ?
00:02:49 :Vous pouvez me dire si c'est pas assez zoomé.Je n'ai pas entendu, c'est bon ou ?Il y a le jeune homme qui entend écrire.
00:02:58 :Encore un petit zoom, ok.C'est où déjà ?150, ok.Ça ira.Donc il n'y a rien de spécial dans les settings, c'est vraiment un projet brut que j'ai juste mis en français.
00:03:15 :J'ai créé une application que j'ai appelée My Forms et voilà.Rien de plus.Du coup, on va voir ça maintenant.J'ai créé plusieurs formulaires.Dans le cas de Django, pour gérer vos formulaires, vous allez créer un fichier forms.py.
00:03:34 :Voilà.Et vous allez pouvoir utiliser ensuite les forms.Il y en a un qui arrive.Vous allez pouvoir utiliser les forms.Et à chaque fois, dans les formulaires que vous allez créer, vous allez hériter d'un objet, soit un modèle form.
00:03:58 :Je considère qu'avec Django, vous connaissez un petit peu déjà les modèles.C'est un peu les premières choses qu'on voit avec Django.Je pense que tout le monde est opé là-dessus sur les modèles, au niveau de la base donnée.
00:04:12 :Ok, on voit des petits pouces.Vous allez pouvoir créer un modèle form.Ça, c'est extra quand vous voulez faire un formulaire qui va vous gérer des instances de modèles.
00:04:24 :Et après, vous pouvez très bien juste faire des... Là, je n'ai pas fait pour l'instant.On verra dans des projets perso après.Vous pouvez très bien faire aussi des forms.
00:04:32 :Donc des formulaires qui ne sont pas liées aux modèles, mais qui peuvent permettre de faire autre chose,comme des formulaires de contacts, par exemple.Parce qu'un contact, ce n'est pas forcément un modèle.
00:04:40 :Un contact, c'est juste envoyer un mail.Vous pouvez très bien faire des formulaires qui ne sont pas basés sur des modèles,juste des modèles basés sur Pure Form, sans modèle.
00:04:49 :Voilà.Du coup, ici, j'ai un modèle.Celui-là, je crois qu'il ne me sert pas du tout.Je voulais l'utiliser, mais finalement, il ne sert à rien.
00:05:00 :J'ai un modèle, Arctic.Donc, j'ai un titre, le corps du message, le texte, je veux dire.La date de publication et l'auteur, ça va être l'utilisateur.
00:05:15 :Et je récupère l'utilisateur avec getUserModel.Voilà.Donc, très basique.Un titre, un contenu, un auteur et une date.La date, je ne suis même pas sûr que je l'en sers dans la formule, de toute façon.
00:05:28 :Et de toute façon, il a un auto-add-through, donc c'est géré directement par Django.Du coup, on va commencer par voir les formulaires de création d'instance.
00:05:43 :Ici, j'ai un formulaire et il y a plusieurs méthodes.On les verra après.Pour commencer, quand vous faites votre formulaire, excusez-moi,vous avez votre classe méta ici.
00:06:06 :Vous renseignez avec la trébule modèle, votre modèle.C'est mon modèle Arctic.Et ensuite, vous pouvez jouer avec les champs.Vous pouvez afficher les champs name et email.
00:06:20 :Vous pouvez afficher tous les champs.Et vous pouvez exclure des champs.Là, c'était plus rapide, par exemple.Dans ce cas-là, même s'il n'y a pas beaucoup de champs,vous pouvez exclure.
00:06:31 :Et comme ça, j'ai tous les champs, sauf le champ hauteur.Et ça me permet de voir comment on peut faire pour renseigner des champsalors qu'ils ne sont même pas dans le formulaire.
00:06:41 :Il faut rejouer un peu avec ça.Excusez-moi.Du coup, on va utiliser les formulaires d'endevue.Pour commencer, ça c'est ma vue d'index.On va faire l'index de mon projet.
00:06:58 :Ça, du coup, je l'ai viré, ça ne sert à rien.Et on va vouloir, par exemple, créer un article.Quand vous avez des formulaires,quand vous allez faire votre vue pour les formulaires,vous commencez par coder, à mettre votre formulaire, par exemple.
00:07:22 :Si vous mettiez Form et que vous enlevez tout,et que vous l'enlevez dans le contexte, le formulaire va s'afficher,mais il n'y aura rien pour le gérer.
00:07:30 :Donc en général, ce que je fais,c'est que quasiment tout le monde, de froid, fait comme ça.Et je sais que Thibault, dans ses formations, il faisait comme ça de tête.
00:07:39 :Il faut toujours prévoir,la personne va arriver dans votre vue avec une méthode Get.Et quand il arrive dans une méthode Get dans la vue,il ne va pas être dans ce cas de figure-là,parce qu'ici, c'est une méthode Post.
00:07:53 :Il va arriver directement dans le bloc Else.Et donc, on va juste afficher le formulaire.Je vais vous montrer ça.Dans le cadre de la fonction,on va créer un article avec la fonction.
00:08:07 :Donc la méthode Get, j'arrive ici,j'ai mon formulaire qui s'affiche.Il est bidon, il est moche, mais ce n'est pas grave.Le but, c'est de voir comment ça fonctionne.
00:08:16 :On essaiera de faire un truc plus beau après,avec un Knispin Forms.Ensuite, quand vous allez soumettre le formulaire,vous allez passer par une requête Post.
00:08:26 :Parce qu'en fait, votre formulaire,ça se présente comme ça.Donc il y a...Merci.C'est sympa.Il y a beaucoup de...Là, j'ai mis du HTML autour,mais ça, c'est juste pour avoir un minimum caractéristique.
00:08:43 :Ce qui m'intéresse, c'est cette partie-là.Pour rendre le formulaire dans votre template,vous allez utiliser la balise Form.Vous allez bien indiquer que vous utilisez une méthode Post,qui va vous permettre de rentrer dans ce bloc-làquand vous le soumettez.
00:09:01 :Toujours le CSRF Token,ce qui évite les attaques CSRF, justement.Il faut souvent le mettre.Et là où Django est fort en sécurité,si dans tous les cas, vous oubliez de le mettre dans un projet,on pourrait se dire que c'est catastrophique,niveau sécurité.
00:09:15 :Mais non, Django, s'il ne le voit pas,il va vous jeter.Il va dire qu'il y a un bug dans votre vue.Ça ne va pas.
00:09:21 :Donc vous ne pouvez pas l'oublier.Vous allez l'oublier quelques fois au débutquand vous allez faire vos premières applications.Et après, ne vous inquiétez pas, ça va rentrer.
00:09:28 :Et du coup, dans ma vue,dans le contexte, je trace bien mon formulaire.Form est égal à l'article Form,qui est ici.Voilà.Là, j'étais là.
00:09:40 :Et donc j'utilise ma valise là, ici,où je rends dans le contexte mon formulaire.Mon ASP, c'est pour qu'il ait un petit rendu plus sympaque si je mettais Form de manière basique.
00:09:51 :Et il ne faut surtout pas oublier votre input,qui va être de type submit,qui va être pour soumettre tout votre formulaire,avec envoyer, et voilà.
00:10:00 :En gros, vous affichez votre formulaire.Quand vous arrivez sur la vue, vous êtes sur une méthode get.Vous l'affichez.Hop, il est ici.Ensuite, j'envoie mon formulaire.
00:10:13 :Je suis dans ma méthode post.Qu'est-ce qu'il se passe ?Dans la méthode post, ici,on va repasser notre formulaire.Et on varéutiliser notre classe.
00:10:25 :Et on va lui passer toute la requête post.Tout le corps de la requête.Et si le formulaire,il est valide,donc s'il n'y a pas d'erreur, si tout se passe bien,on va le sauvegarder.
00:10:37 :On va partir, juste,parce que là, j'ai déjà fait un truc un peu plusavancé que ce qui se fait habituellement.Est-ce que j'ai pas un petit formulaire de base,qui s'y prête bien ?
00:10:47 :Allez, on va aller voir là-dessus,sur les utilisateurs, peut-être.Ça, c'est déjà du gros projet.Ça, pour info, par exemple, c'est un formulaire,mais qui est déjà plus avancé.
00:11:01 :Mais bon, c'est pas le but.Forms et une vue, ici.Est-ce que j'ai un sign up ?Voilà, je vais pas l'enregistrer.Ici, vous pouvez très bien faire...
00:11:13 :Non, j'ai pas un bon exemple.C'est pas grave, on va repartir sur l'autre,et je vais modifier.Je suis où ?J'étais ici.On va commenter tout ça.
00:11:25 :Quand vous allez apprendre à faire des formulaires,vous allez sûrement avoir le casoù vous allez faire un form.save.Et là, votre formulaire,il est à vous garder, tout se passe bien,vous êtes dirigé vers l'index,et votre instance, elle est créée.
00:11:41 :Sauf que là, en fait,la différence,avec ce qu'on a fait tout à l'heure,c'est que dans le formulaire,on a exclu le champ hauteur,et du coup, si on...
00:11:53 :on règle le formulaire,on n'a pas d'auteur,et du coup, ça va pas.C'est pas possible.On va essayer de lui attribuer une variable.Donc là, vu qu'on sauvegarde un article,j'utilise la variable article,qui est égale à form.save,
00:12:09 :et quand vous faites un commit égale false,parce qu'habituellement, vous mettez rien,vous faites form.save pour sauvegarder,mais là, vous pouvez faire un form.saveavec un commit égal à false,donc vous allez sauvegarder l'objet en mémoire,mais pas en base de données.
00:12:23 :Ce qui vous permet, après, de travaillersur l'instance sur laquelle vous êtes en train de créer.Et donc là, ici, dans mon article,ici, il y avait l'auteur,et bien, on peut faire comme ça,article.auteur
00:12:35 :égal request.user,donc c'est l'utilisateur qui est connecté,et ensuite, vous faites article.save.Et voilà, et là, vous redirigez vers l'index.Donc vous pouvez très bien ne pas afficherdes champs dans votre formulaire,mais quand même les gérer au niveau de la validation.
00:12:49 :Donc moi, par exemple, je veux pasqu'utilisateurs, forcément, puissent choisirun utilisateur, ça serait débile,et bien du coup, en fait,la validation du formulaire, ça sera l'utilisateur connectéqui sera forcément auteur de l'article.
00:13:01 :Bien sûr, pour ça, je ne l'ai pas misparce que ce n'est pas le but, mais il faut penser toujoursà mettre un loginrecouvert d'ici pour quel'utilisateur soitforcément connecté, sinon ça ne marchera passi l'utilisateur n'est pas connecté.
00:13:15 :Donc la petite démo.Tac, tac.Si je parle trop vite, vous pouvez le dire,il n'y a pas de problème.Donc là, ici,on a notre...
00:13:27 :Je vais écrire n'importe quoi, je ne sais pas...On est sur...Ça, c'est le titre.Et on va mettre...Ah bah oui, forcément, je ne suis pas connecté.
00:13:45 :Je n'ai pas mis le guide QRN, il faut que je le connecte.Je vais me connecter vite fait.Hop, hop.Et on recommence.On recommence.
00:13:57 :Hop.Tac, je l'avais copié.J'envoie.Et voilà.Il est où ? Il est en bas, c'est celui-là.Donc on a créé cet article ici.Maintenant,on a géré notre formulaireavec une vue basée sur une fonction.
00:14:15 :Est-ce queça va ou je suis trop vite ?Dites-le moi, je préfère faire une pauseet revenir sur les points si ça va trop vite.
00:14:23 :Ok.Si d'autres...Ça va, John ?C'est vrai, ça peut être...Ok.Donc si j'ai l'honneur, je ne peux pas tarder, je crois.Si j'ai l'honneur, s'il y a un sujet sur lequel je veux que je revienne,tu le dis surtout.
00:14:49 :Là, je viens un peu vite.Et du coup, il y a quelque choseque j'ai oublié...que je voulais préciser, c'est quand vous faites...quand vous êtes ici.
00:14:59 :Donc ça correspond au champ de votre formulaire.Le formulairequ'on a ici, parce qu'on a excluhauteur, on a tous les autres champs.Sauf le champ Date,parce que le champ Date, il est géré par Djangoquand on met un autonad en paramètreautoad...
00:15:15 :C'est géré par Django, donc on ne le voit pas.Ce qu'il se passe,c'est quece qu'on fait en Django est rendu dans le formulaire.
00:15:23 :Je suis dans le label.Donc là, j'ai le champ Content.Et là, j'ai mon titre.Donc en fait,nous, on fait du Python,et Django se chargede créer tout ce qu'il faut en HTMLdans le template.
00:15:43 :Donc ça, c'était un peula base, j'aurais dû en parler dès le début, maisvoilà.Maintenant, c'est fait.Vous pouvez aussi,quand vous avez un formulaire comme ça,de création,donc là, on est typiquement sur une création d'instance,utiliser une classe.
00:16:01 :Certains aiment bien, parce quemoi, ça dépend, je fais des fonctions, je fais des classes,ça dépend demon besoin.Avec les classes, ça peut paraître plus structuré.
00:16:13 :Donc, vous pouvez importer, du coup,une createView,qui est dans django.js.generic.Voilà, donc vous faites une classequi hérite de createView.En attribut,vous indiquezquel modèle utiliser, donc ici, article.
00:16:29 :Quel formulaire ? C'est l'article form.Si vous ne mettez pas deform class,en fait, Django va utilisertous les champsdu modèle,automatiquement. Mais moi, je ne veux pas ça.
00:16:45 :Forcément, je mets unformulaire personnalisé.Le template, la successURL,une fois que le formulaire est validé,c'est où on est redirigé.Ce qui va se passer, c'est pareil.
00:17:01 :Vous allez voir que la vie,ça ne change rien au niveau durendu.Là, c'est la création de l'article par les classes.C'est exactement pareil.
00:17:11 :Donc, on peut fairecomme on a fait tout à l'heure,marquer 2.Bonjour.Et là, c'est la même chose.On a notre template qu'on a fait.
00:17:25 :Ça, c'est le deuxième. Il est ici.Donc, on a fait exactementla même chose, mais avec une classe.Sauf qu'il y a la différence avec une classe.
00:17:33 :Donc là, vous voyez iciqu'on gérait ça ici avec notreifformisValid.Ici, on utilise la méthode formValid.On lui passe ici le form.Et ce qu'on peut faire, c'estform.instance
00:17:47 :.instance.returnest égal à self.request.user.C'est ce qu'on a fait ici.Nous, on a fait tout ça ici.L'auteur ici, on le rajoute là.Ici, on fait comme ça.
00:18:03 :Parce que la requête,dans une vue fondée sur les classes comme ça,ici, on l'utilise en tant qu'attribut,la requête.Voilà. Et ensuite,on retourne notre super, et comme ça,on sauvegarde. C'est en base de données.
00:18:17 :Voilà. Donc ça, ici, c'étaitjuste pour mon contexte.Ça n'a rien à voir avec le formulaire. C'était juste pour moim'ajouter un petit...Une méthode en plus pour faciliter les choses au niveau du template.
00:18:29 :Donc voilà. Vous avez la versionavec une classe pour créer votre instance.Et la versionavec une fonction.Sur quoi je voulais...Est-ce que je voulais revenir sur les formsets maintenant ?
00:18:43 :On va revenir sur les mises à jour.Donc, vous avez votre article,et vous voulezmettre à jour dans votre article.Plusieurs façons de faire, c'est pareil.
00:18:53 :Voilà.Dans le cas,on aurait plusieurs formulaires différentsdans la même vue.Fonction, classe.Plusieurs formulaires dans la même vue,est-ce que ça m'est déjà arrivé ?
00:19:09 :Il me semble.C'est possible.J'utiliserais peut-être plutôtune fonction.Une fonction.Mais Johner, je suis d'accord avec toi. C'est vrai que quand j'ai descreateView à faire ou de updateView, souvent,j'utilise des classes.
00:19:25 :Parce que c'est pratique.Surtout quand tu verras, Johner,avec les vues de login,quand tu as un login à faire,éviter de te tapertoutes les fonctions Authenticateet Login, tu te fais une LoginView.
00:19:39 :Et en fait,c'est un peu le même principe,sauf que ton formulaire, ça va être un formulairede login.Et tu n'as même pas besoin de le spécifier parce que Django le gère pour toi.
00:19:49 :Et comme ça, tu n'as rien à faire.Je vois qu'il y a des messages.Je regarde juste les messages.Je vais voir si c'est répondu.
00:20:02 :Il y a un petit message.Je continue tant que tu écris.Maintenant, vous pouvez aussi mettreà jour votre article, votre instance.J'utiliseune updateView, sauf que là,il faut penserà lui passerici, à votre vue, un PK.
00:20:22 :Ou autre chose, quelque chosequi identifie votre instance.Bonjour Mohamed.Je ne voulais pas préciser,mais forcément,ça va de soi que pour toutes mes vues ici,j'ai des URL.
00:20:40 :Là, on a vu les deux vues,CreateArticleView et CreateArticleView.sue.Mais ça, ça va de soi.Quand on veut mettre à jourun article, par exemple.
00:20:52 :Là, je l'ai fait dans mon index.En fait, dans mon index,j'ai fait en sorte qu'on puisse accéderà tous les articles.Je l'ai fait deux fois, mais vous allez comprendre pourquoi après.
00:21:02 :Faites comme si je ne l'ai fait qu'une fois.On va bien séparer les choses.On ne peut pas le voir.Dans ma vue d'index, ce que j'ai fait,je peux le remettre dans le contexte.
00:21:12 :Mes URL sont là.Dans ma vue d'index, j'affiche tous mes articles.Avec mon QuerySet.Moi-même,je présente juste commentutiliser les formulairesavec Django.Ce n'est pas vraiment un projeten soi.
00:21:32 :On va s'amuser un peu avec les formulaires.Dans ma vue d'index,pour que ce soit plus pratique,j'affiche tous mes articles.Je les rends dans le contexte.
00:21:46 :Dans ma vue d'index,je boucle ça sur tous les articles.Pour chaque article,je crée un lien pour accéder à l'article.Sauf que là, j'ai créé un lien.
00:21:56 :Une URL.Ici,attendez, j'en ai un peu beaucoup.On va le dégager.Le modèle, on le connaît.On va garder ça.Le formulaire,on reviendra après sur les méthodes clean.
00:22:12 :Ici,j'ai créé un lien.Une URL qui s'appelle UpdateArticleThunk.C'est celle-là.Le name est là.Ça utilise l'updateView.L'updateView,elle est là.J'ai récupéré ici, avec le PK,l'article que l'on veut modifier.
00:22:36 :J'utilise la méthodegetObjectOr404,mais je pourrais très bien fairec'est pas vraiment la même chose,mais pour récupérer un article,je pourrais très bien fairearticle.object.get
00:22:52 :le PK est égal au PK.On récupère l'articlepar sa clé primaire.Le PK, dans la base donnée,ça va être la clé primaire si elle est unique.
00:23:02 :Une clé primaire, c'est vraiment unique.On ne peut pas avoir plusieurs instancesqui ont le même PK.Avec le PK, ça permetde récupérer un élément.
00:23:14 :Comme ça, tu es sûr que l'élément est vraiment unique.Là, tu pourrais très bien faireID, parce que par défaut,je n'ai pas utilisé l'ID.
00:23:24 :Par défaut, l'ID, dans les modèles Django,ça va être le PK.Si je ne dis pas de bêtises,si je fais ID égale PK,on va lancer, vous allez voir.
00:23:34 :Il y a des trucs de base comme ça,qu'on n'a pas fait depuis longtemps.Ici,c'est bon, ça le récupère quand même.On peut très bien mettre ID ou PK.
00:23:46 :C'est pareil.C'est quasiment la même chose.Je crois qu'on peut...Je ne l'ai jamais fait.Je n'ai jamais touché à l'ID.Il me semble qu'on peut modifier.
00:24:02 :Il me semble que l'ID peut pointer vers autre chose.Je ne préfère pas en parler,parce que je ne suis pas sûr de moi.C'est un truc que je ne fais jamais.
00:24:12 :Je ne touche jamais à ça.Je préfère avoir récupéré mes éléments uniques,soit par l'ID, soit par le PK.Du coup,je récupère mon instance ici,avec le PK,parce que je l'ai en paramètre.
00:24:26 :Et là, c'est pareil.Quand j'arrive dans la vue avec une méthode GET,j'ai mon formulaire,sauf que je lui passe une instance.Et mon instance, c'est l'articleque j'ai récupéré ici.
00:24:38 :C'est le même principe.Quand je soumets le formulaire,je suis dans une méthode POST.Pour info, j'utilise le même templatepour tous les formulaires.Voilà, j'utilise tout pour le formulaire.
00:24:50 :C'est pour ça que j'ai mis une balise title.Comme ça, j'envoie un titre.Title, ici, je metsmises à jour fonctions,et ainsi de suite. Comme ça, je les appelle différemment.
00:25:00 :Les pages s'appellent différemment.Créate fonction, voilà.Donc,quand on est dans une méthode POST,on vautiliser notre classe,notre formulaire.On va lui passer la méthode POST,et on va lui repasser l'instance.
00:25:20 :On la passe ici,et on la repasse ici.Et si le formulaire, il est valide, ici,on a juste à le sauvegarder.Et ici, je fais un redirectvers la vue dans laquelle je suis.
00:25:32 :Alors ça, c'est...J'aurais pu faire un truc plus simple,mais c'est une technique pour éviter que les genssoumettent les formulaires comme des bourrins quand ils n'y arrivent pas.
00:25:40 :Mais là, je suis redirigévers la page dans laquelle je suis déjà.Donc, en fait, vous allez être redirigé dans la pagede mise à jour de votre formulaire.
00:25:48 :Autrement, on pourrait très bienfaire un redirect sur une pageoù on affiche l'article en entiersans formulaire. On pourrait très bien être redirigésur l'index. On fait ce qu'on veut, mais là,
00:25:58 :j'avais mis ça juste pour en parler,parce qu'il y a...pas tout le monde le connaît, en fait, mais c'est assez pratique.Ça peut vous éviter de...
00:26:06 :d'écrire des soumissions de formulairequi se fassent en vous en actualisant à chaque fois.Voilà. Bon, là, ce n'est pasforcément le bon exemple vu lequel j'utilise, maisc'est toujours sympa de savoir que ça, ça existe.
00:26:16 :Voilà. Donc, après, on verrala relation classe. Donc, ici, si je retournedu coup...si je vais dans mon indexoù j'affiche tous mes formulaires,tous mes articles,j'ai mis quedes liens, en fait, pour aller versles formulaires pour modifier mes articles.
00:26:34 :Donc, j'utilise mon URL ici.Donc, l'URL, ça s'appelleupdateArticleen fonction.Ici, je passe le PK à l'URL.J'utilise ma... du coup, on a vu
00:26:46 :à l'instant, et je lui donne un nom.Et ce que je fais dans l'index, pour chaque article,donc je loupe sur mes articles, je lui passele nom de l'URL.
00:26:54 :On n'oublie pas le petit tag URL ici.J'utilise le PK de l'URLet, donc,j'utilise le PK de l'article. Voilà.Donc, ça, on n'est pas obligé d'utiliser, de nommer,mais moi, je préfère nommer. Donc, je fais
00:27:06 :article.pket le titre de l'article.Donc là, vous allez comprendre.Donc là, dès qu'on va cliquer ici,on va aller sur le formulaire pourupdate les articles.
00:27:18 :Donc, hop,et là, je suis bien sûr mon instance.Si je mets, je rajoute ici,par exemple, 35,hop, c'est sauvegardé.Vous voyez mieux, on va revenir sur l'accueil. C'était celui-là.
00:27:30 :Voilà, 35. Donc là,l'instance a été sauvegardée quand je l'ai fait envoyer.Maintenant,on a la même chose en fonction, et vous allez voir quec'est pareil. On va revoir le résultat.
00:27:40 :Si je fais ça, hop,là, j'ai redirigé vers l'index, du coup, pour vous montrerqu'on peut rediriger autre part. Mais si je retourne dessus,il y a bien un 35.
00:27:48 :Voilà.Donc, pour la version avec lesclasses,donc, Johner, je pense encore une fois que tu vas aimer,hop, c'est pareil.Au lieu d'utiliser la create view,dans quelle situationpeut-on avoirà faire au formulaire ?
00:28:06 :Voilà, c'est ça.Login, formulaire de contact.Je vais t'en montrer, après, si tu veux, rapidement,sur la fin,dans tous les projets que j'ai,sur quoi j'utilise.
00:28:18 :T'as plein de choses. Par exemple, j'ai crééun forum où les gens posentdes messages. Ils peuvent envoyer des messages privés,des formulaires de création de forum.
00:28:26 :On va regarder ça après.Et donc,j'utilise l'update view. Avant, on avait la create view.Donc, il est là.On a ça dans le même module, l'update view.
00:28:36 :Donc, c'est pareil. On utilisele modèle, le formulaire,un template, une success URL.Donc ici, j'ai mis index.Et voilà. Et en fait, il y a juste
00:28:46 :ça, et la mise à jour se fait.En fait, vous n'avez même pas besoinde renseigner, entre guillemets, le pk,quelque part, puisquec'est la classe qui va le gérer pour nous, en fait.
00:28:56 :Pour utiliser une update view,il faut savoir qu'il faut utiliserdans l'URL, il faututiliser si ça prend en chargele pk ou le slug.
00:29:08 :Si on a un article avec un slug, voilà.J'ai un doute, mais on est sûr que c'est ça.Donc, voilà.Là, on a fait...On a vu la création,l'update.
00:29:22 :Et maintenant, il y a un truc qui est assezsympa avec Django, c'est quevous pouvez afficherplusieurs formulaires d'impôts.Par exemple, sur un site marfant, vous avezplusieurs objets dans votre panier,et vous pouvez afficher plusieurs objets.
00:29:38 :Là, par exemple, ici,j'affiche tous les articles d'impôts qui existent.Et je peuxtrès bien les modifier un par un.Donc ici, je modifie, je modifie, je fais desmodifs, je peux envoyer, et j'ai toutqu'est sauvegardé en bloc, là.
00:29:52 :Donc ça, c'est déjà plus avancé.On va peut-être pas trop s'attarder dessus, parce queon peut facilement s'y perdre.Ce que j'ai fait ici,c'est... Ils sont où ?
00:30:02 :Une FormSetView. Voilà.Alors, ce qui se passe ici...Maintenant, on n'est plus dans l'index.Tac, mon FormSet ici, là.L'URL du FormSetView, elle est tout simple.
00:30:12 :En fait, une FormSetView,c'est pour afficher plusieurs...plusieurs formulaires d'impôts.Du coup, vous allezdéjàrécupérer dans une variabletoutes les instancesque vous voulez avec une requête.
00:30:30 :Donc ici, par exemple, je vaisfiltrer tous les articles en fonction de sonmoteur. Donc là, c'est l'utilisateur qui est connecté.Ensuite,je vais me créer iciun objeten utilisant le modèle FormSetFactory.
00:30:44 :Donc ça, je l'ai importé ici,de django.forms.C'est assez chiant au début.C'est assez chiant à utiliser, mais vous allez voirque c'est assez pratique.
00:30:54 :Vous passez icivotre modèle.Le formulaire.Pour l'instant, c'est tout. D'accord ?extra="0", c'est pour...En fait, c'est pour ne pas que ça vous créeun formulaire supplémentaire. Je vais vous montrer.
00:31:10 :Là, j'ai mis extra="1".Ici, ce n'est pas adapté à notre cas.C'est que ça va vous laisser un formulaire vide en plussi vous voulez créer une nouvelle instance.
00:31:18 :Mais avec nous, ça ne va pas.Excusez-moi.Ici, on va laisser 0.Et ensuite,votre FormSet, vous allez utiliserici le FormSetque vous avez défini ici.
00:31:34 :Vous allez l'utiliser en passant votre Pluralset.Il y a plusieurs étapes.Moi, je fais ici ma requête pour récupérertoutes les instances que je veux.
00:31:42 :Je veux créer un FormSet iciavec le modèle FormSetFactoryavec le modèleet le formulaire que je veux utiliser.Et ensuite,là, je crée vraiment mon FormSetavec mon objet qui est iciet en passant le CoreSet que j'ai ici.
00:31:58 :Etmon FormSet ici,je le rends dansmon contexte.Et pareil, si c'est une méthode post,si c'est une méthode post,je traitemon FormSet avecrequest.post,
00:32:16 :mon CoreSet.Si c'est validé, je le sauvegarde tout simplement.Et par contre,là où c'est un peu plus spécial, c'est qu'il fautécrire plus de choses dans le template HTML.
00:32:26 :Donc c'est pareil, vous avez votre formulaire,vous avez votre CRF token.Il faut utiliser forms.ManagementForms.Ça, c'est piège. J'ai souvent oubliéet je crois que le Django ne lève pas d'erreur quand vous l'oubliezet en fait, il n'y a rien qui s'affiche.
00:32:40 :Du coup, vous cherchez pendant un quart d'heure.Comme ça, vous savez,vous utilisez le ManagementFormset ici, pour chaque formulairedans Forms,vous bouclez et vous affichez icivos petits formulaires.
00:32:54 :Ici, j'ai passéforms.instance.publication.Pourquoi ? C'est parce qu'en plus,avec les FormSets,ici, j'ai affiché la date.Donc vous pouvez afficher non seulementvos formulaires,mais en plus, on peut s'amuserà afficherles objets de notre modèle.
00:33:14 :C'est assez sympa.Les FormSets,je vais aller un peu vite dessus.Ce n'est pas simple au début, mais vous aurezbesoin de le voir si vous faites la formation Djangoà Thibault. Je ne sais plus
00:33:26 :s'ils le montrentassez tôt ou c'est peut-être dans le projetd'e-commerce.Déjà, on a vu un peu à quoi ça ressemblait un FormSet.Maintenant,ce qui peut être rigolo avec les formulaires, on va s'intéresservraiment purement au back-end et à la validation.
00:33:40 :On est là.Ici, dans mon formulaire,ah oui, il y a Jester là.Dans mon formulaire,j'ai défini des méthodes.Donc, les méthodesclean. On va placer les méthodes clean.
00:33:54 :Et en fait, si vous voulez gérerles validations par rapport àcertains champs de votre formulaire,donc là, dans mon modèle, j'ai un champ en title.
00:34:02 :Donc ici,j'ai CleanTitle.Ça va être une validation par rapport au titrede mon article.CleanContent, ça va être une validation par rapport au contenude mon article.
00:34:14 :Et DefClean, en fait, vous pouvezgérer un peu toutes les validations que vous voulezentre guillemets dedans.Mais moi, je vais m'en servir, par exemple, pour gérerdes validationsentre les attributs.
00:34:26 :Entre les relations entre les attributs.Entre les attributs.En gros,ici, si le titre, il fait moinsde 10 caractères,avec Forms,j'utilise ValidationError.Et comme ça, il y a un messagequi s'affiche. En gros,
00:34:44 :le titre risque d'avoirplus de 10 caractères.Si dans le message de monarticle,il y a Patrick, et bien Patrick, il n'est pasautorisé.
00:34:58 :Et ici, ce que je fais,ce que je récupère ici dans ma méthode cleanglobale,en fait, je récupèrele titre.Toujours utiliser CleanData.Appeler super avant, c'est plus pratique.
00:35:12 :Et comme ça, après, vous pouvez faire un CleanData.get.title.Ça, c'est notre champtitle qui est dans notreformulaire.Puisqu'il est lié sur le modèle,on a juste exclu ce champ-là.
00:35:24 :On récupère le titre.On récupère le contenu.Notre champ-contenu.Et en fait, si on a un titre et un contenu,et que le titre,enfin un titre et uncorps, enfin un message,si on a un titre et l'article,et si le titren'est pas dans le contenu, c'est un peu bidon,
00:35:44 :mais vous voyez, si le titre n'est pasdans le corpsde l'article, eh bien,on dit que le titre doit être dans le contenu de l'article.
00:35:52 :Simplement.Et voilà, en fait, vous pouvez faire comme ça.Vous récupérez icititle égale self.cleandataet vous récupérez justement, du coup,votre titre. Et ici,
00:36:04 :votre contenu du message.Donc, on va faire le test.Que je ne lui perde pas. Donc, ici, on va créerun... Hop là.Donc, il fait moins de 10 caractères,par exemple. Je ne sais pas, on va mettre
00:36:18 :docstring.Hop.On écrit un article.Et là, hop.On doit avoir plus de 10 caractères.Ensuite,je vais...Je vais faire un truc, je vais copier, allez, 3 fois docstring.
00:36:34 :Et je vais mettre autre chose.Et je vais mettre...Bon, il faut... Voilà. Donc,on a écrit. On avait dit, dans la validation,quedans le clean, en général, il fautque le titre soit dans le contenudu message.
00:36:50 :De l'article. Hop.Il n'y est pas. Donc, on a une erreur.C'est pas validé. On avait dit aussi...Donc, maintenant, on va mettre un...Hop.
00:37:00 :Donc, c'est dedans. Mais par contre,on va rajouter Patrick.Et hop. Patrick, il n'est pas autorisé.Donc, c'est desexemples débiles, mais au moins, vous voyezun peu ce qu'on peut faire au niveau des validations.
00:37:14 :Donc, on peut gérer les validationsau niveau des...Au niveau des attributs.Voilà. Au niveau de vos champs, je veux dire.Pour chaque champ individuellement.
00:37:24 :Ou, ici, vous gérez, en fait,des validations de manière plus globale.Voilà.Ça a été ou...T'es trop vite ou pas trop galère ?Super.
00:37:44 :Merci.Euh...Maintenant, un petit sondage.Est-ce que vous voulez qu'on mette en placeun ricachat ?Ou vous voulez voir un truc de foupour que votre formulaire soit très beauavec très peu de lignes de code ?
00:38:04 :Les deux.Bon, il y a un peu de tout.OK. Bon, allez. On va se dépêcher.OK.J'ai entendu que je ne l'ai pas fait,alors peut-être que ce n'est pas très compliqué à faire.
00:38:20 :Euh... Tac, tac.Alors, je vais... On va utiliser, du coup...On va utiliser...Euh... Qu'on s'appelle déjà ?J'ai oublié.Hop là. C'est Christophe et Forbes.
00:38:34 :Forbes.Hop.Ça, c'est dans chaque projet.Ça, c'est dans tous les projets que j'utilise.C'est vraiment...Ça, c'est extra. Vous allez voir.En fait, pour l'installer, il n'y a rien de compliqué.
00:38:52 :Hop.Juste, je préfère vous direque j'ai un template de baseet que j'utilise Bootstrap.Toujours.En ce moment, je suis une brelle,donc je sais juste faire du CSS de manière basique.
00:39:06 :Et donc, Bootstrapm'aide beaucoup. C'est vraiment extra pour ça.Voilà. Donc, c'est parti.Hop.Donc là, du coup, j'ai copié sans faire exprès.Euh... J'attends d'installer ma...
00:39:18 :Ici.Hop.On installeChristophe et Forbes.OK. C'est bon.Et là, plusieurs choses à faire.Je vais mettre l'écran en bas parce que je ne vais pas faire des...
00:39:32 :Je vais expliquer au fur et à mesure.Ce qu'il faut penser à faire ensuite dans vos settings.Comme quand vous créez une application,quand vous installez Christophe et Forbes,il faut penser à l'ajouterici dans les applications installées.
00:39:46 :Donc, Christophe etForbes.Euh... Voilà.Et ensuite, moi, j'utilise Bootstrap 5.Et donc ensuite,hop, je vais aller...C'est expliqué dans la doc,mais vous pouvez ensuite installer l'expansion pour Bootstrap 5.
00:40:02 :Voilà. Donc, on vainstaller la version Bootstrap 5.Vous allez voir à quel point ça va aller vite.Et là,si j'étais bêque, je suis dégoûté.
00:40:14 :Et donc,pareil,ici, dans les applications installées,on est là.Hop.Utilisez Bootstrap 5.Et voilà. Normalement,je n'ai rien oublié. Je ne pense pas.
00:40:34 :Et je mettais mis un petit mémo à chaque foisle... Il est où mon...Voilà. Il est là.Hop.Maintenant, dans les formulaires,mon template est où ?
00:40:46 :Là, ici.Le formulaire des articles.Tac.On étend avant. J'ai un doute.On étend avant. On met letag après.Et ici, au lieu de faire form.asp,
00:41:00 :je fais rtspi.Et là,si j'ai un bug, je ne suis pas content.Et voilà.Pourquoi ?Ah, bah oui, forcément.Forcément, j'ai oublié la moitié.
00:41:16 :Tac, tac, tac. Il l'explique.Il l'explique, je ne sais plus où.Et voilà. En fait, dans vos settings,il faut penser à mettre ça.Voilà. Forcément.
00:41:28 :Sinon, vous faites jeter. Hop.On va le mettre à la fin.Voilà.Hop. On va aller recharger le projet.Et là, si ça ne fonctionne pas,on verra bien. Et voilà.
00:41:42 :Et donc là, vous avez vu, tout à l'heure, on avait un espèce de vieux formulaireà l'ancienne,en bas de 2003.Et maintenant, on a déjà un truc plus sympa.
00:41:50 :Et je n'ai fait aucune customisation.Sachant qu'après,on peut le customiser. Mais là, déjà, de base,en mettant juste,j'en étais au boom,le petit fil crispy.
00:42:02 :Donc, il faut bien penser à importer les tags.Mais en mettant juste un petit fil crispy,et bien,j'ai un formulaire plus sympa à utiliser.
00:42:10 :Voilà.Ça vous a plu ?Il y en a qui connaissaient ? Je sais déjà, ou pas ?Parce que ça, j'avoue que c'est vraimenttrès pratique. Comme ça, vous n'en devriez pas faire du fond.
00:42:20 :Il y a quelques petits manip à faire.Ah, franchement, moi, je suisassez fan.Après, que ce soitTellwind, je crois qu'il y amême Bulma. Il y a Tellwind.
00:42:40 :Ça, je ne connais pas. Il y a Bulma aussi.Et Tellwind.Tu vas pouvoir t'amuser avec, du coup.Le jour où tu fais ça avec Tellwind, par contre, je suis curieuxde revoirce que ça rend avec Tellwind.
00:42:54 :Ça m'intéresse bien.Voilà.Je vais juste vous montrer pour unexemple.Pour exemple,c'est ce que je fais, moi, avec CrispyForms.J'ai un projet icique je n'ai pas fini parce quej'ai plein de trucs à faire en ce moment.
00:43:16 :Je ne sais plus d'où je l'ai mis.Ici, StockitForms.Voilà, c'est ça.Avec CrispyForms, en fait, ce que vous pouvez fairec'est, voilà. Par exemple,
00:43:28 :ici, j'ai un modèle supplier.Enfin, on s'en fiche.Là, c'est juste pour l'info.Avec CrispyForms, vous pouvez surcharger votre méthode initici.Etvous appuyez sur les objets.
00:43:42 :Ils sont CrispyForms, il est où ?Voilà.Il peut y avoir des rows, des columns, machin.Et en fait, vous pouvezcomme ça, votre formulaire le mettre en formedans votre méthode init.
00:43:54 :Et en fait, vous faites votrevous utilisez vos classes CSSdirectement dans Python.Voilà.Moi, je trouve que c'est assez sympa de pouvoir faire ça.
00:44:04 :Mais bon, là, on n'aura pas le temps de tout voir.Ouais, tu vas voir.Franchement, on regarde un peu la doc et tu vas voir.
00:44:10 :C'est dommage, en fait, qu'il reste les deux heures sur les formulairesparce que j'ai plein de choses que j'ai en tête là.Donc voilà, juste à savoir qu'avecCrispyForms, du coup, vous pouvez vous amuserà tout faire comme ça avecvos colonnes, machin. Donc là, moi, j'utilise
00:44:24 :des fonctions parce que j'aides formulaires. Donc là, j'ai un formulaireet j'ai un autre formulairequi hérite du premier formulaire. Du coup, je me suis créé des fonctions
00:44:32 :pour...avec de l'unpacking pourêtre plus efficace, quoi.Mais vous voyez, avec CrispyForms, on peut faire des trucs de malade.Du coup, on avait dit récap' ça.
00:44:44 :Mais juste avant,juste avant, je vais passer quand même vite fait dessusparce que ça m'embête de ne pas en parler.Avec les formulaires, j'avais un...
00:44:52 :Voilà. Bon, ça, c'était un projet...Tac.Ici, je sais pas.Forms.Alors, oui. Normalement, c'estun fichier forms.py, mais moi, je découpe plus en package.
00:45:06 :Donc là, j'ai un package formset j'ai plusieurs fichiers à l'intérieur.Avec les formulaires, en fait,vous pouvez... Donc, il y a déjàdes widgets de base qui sont impliqués dans Go.
00:45:18 :Mais vous pouvez modifierles widgets que vous utilisez.Et là, par exemple,j'ai installé Django Flatpickeret j'utilise des widgetsun widget...Voilà.On peut dire que c'est pas un widget de Django.
00:45:34 :Mais on peut très bien importer des widgetset utiliser des widgets différents que ceuxqu'il y a de base avec Django.Mais voilà. J'aurais pu
00:45:42 :vous expliquer déjà qu'on peut utiliser des widgetset pas forcément ce qui estrendu de base avec Django.Si je retourne vite faitici, dans monforms...
00:45:54 :Là, je n'utilise pasde formulaires.Je ne sais pas si, par exemple, on peut utiliserun autre champ. On va créer un champbidon.C'est un champ bidon.
00:46:06 :Voilà.Un champ bidon,ça va être...J'ai l'habitude d'importer des modules.On va utiliser quoi ?Un champ...Ici, il y a des booleans fields.
00:46:24 :Il y a plein de choix. Il y a les choice fields.Enfin bref, on s'en fiche.C'est juste pour vous montrer qu'on peut modifier le widget.
00:46:30 :Et dans les widgets,là oùvous voyez sur la droite ici,on sait ce qui est widget ou pas widget.On a les champs et les widgets.
00:46:40 :Là, on peut avoir un password input.Pour l'écart field.Là, ça ne sert à rien de mettre ça ici.Il y a plein de petits widgetsqu'on peut utiliser comme ça pour modifierl'aspectde nos formulaires.
00:46:54 :C'est bon à savoir.Vous pouvez faire ce que vous voulez avec vos petits widgets.Et vous pouvez aussivous amuser.Je retourne sur l'autre. Je crois que je l'avais fait.
00:47:04 :Ouais, tu peux ajouter des images.Écoute, on ne va pas trop s'adressersur les champs. Je vais passer sur les images.Je ne sais pas si j'ai un exemple ici.
00:47:18 :Non,je n'ai pas là. Je ne sais plus où je l'avais fait.Sinon,date.Là, c'est justement mes méthodes clean.Je me suis bien amusé avec les dates ici.
00:47:38 :Non,je n'utilise pas les widgets là-dedans.Pour les photos,j'ai un exemplequi peut t'intéresser.Ça, c'est un gros projet.Je ne sais pas si j'ai réussi à le lancer.
00:47:52 :J'ai créé un systèmeen faitqu'on ne se moque pas du front.On va recharger la page parce que le front n'est pas chargé.Voilà, c'est un peu mieux.
00:48:04 :J'ai mon compte qui est connecté.Et justement,ici, on peut charger une photo.On peut charger une photo.Et j'en profite au passage,c'était moi qui posais la question, dans quel cas j'utilisaisdes formulaires ?
00:48:20 :Ici, je peux utiliser un formulaire pour créer un forum.Et ensuite, quand je suis dans mon forum,boum,là c'est un peu simple.Je peux avoir des formulairespour pouvoir écriredes sujets.
00:48:34 :Ou pour répondre.Ou pour avoir un message privé.Pour envoyer des messages.On peut répondre par exemple avec des formulaires.Il y a plein de cas différents avec les formulaires.
00:48:46 :Pour réserver les dates par exemple.Et donc, pour revenirjustement à l'histoiredes médias avec les formulaires,on va prendre quelque chose qui est assez parlant.
00:48:56 :Est-ce que j'ai une photo ici ?Est-ce que dans lescomptes utilisateurs, j'utilise...Je ne sais plus où je fais ça.Non, ça doit être dans...
00:49:10 :Pas dans un compte, dans forum.Dans forum,j'utilise...CreateForum.Donc ça c'est un champ d'images.Donc CreateForum, du coup,création.Voilà. En fait, quand tu veux
00:49:28 :avoir un champ d'images,donc là c'estun formulaire basé surun modèle, excuse-moi, je vais y arriver.Ça va être mon modèle forum.Ici, j'ai un champoù justement j'utilise un image shield.
00:49:42 :Voilà. Et doncles gens ici, ils peuventcharger une image, du coup,avec le formulaire basésur ce modèle.Qu'est-ce que j'allais dire ?Je ne sais plus. Donc voilà.
00:49:56 :J'ai le champ images. Et en fait, par contre,quand tu valais ton formulaire ici,donc déjà, il faut penserdans ton formulaire à utiliser ce...
00:50:06 :Comment on appelle ça déjà en HTML ? Enfin, pas cette classe.Moi j'appelle ça un attribut, maisc'est tellement bon HTML, CSSque je ne sais plus comment on appelle ça.
00:50:14 :J'ai un truc de mémoire.Bref, il faut spécifier le type.Voilà. Il faut que tuspécifie ici formData.Attribut, voilà.Il faut que tu spécifie ça, sinon, en fait, ton image,tu n'y arriveras pas.
00:50:30 :En fait, ça n'arrivera pas.Et au niveau, par contre,de la gestion dans ta vue,donc là, c'est création.Alors, je ne veux pasvous perdre, mais juste pour vous montrer,quand je gère ma vue, je gère ça avec des fonctions externes.
00:50:44 :CreateForum.Voilà. Dans ma vue, en fait,je passe mon formulaire.Je ne sais même plus où je le fais.C'est avant.Voilà. C'est ça.Tu passes tes files ici.
00:50:58 :Tout à l'heure, on a vu qu'on faisait un request.post,mais en plus, tu fais request.files.Voilà. Pour passer tes médias, en fait.Voilà.Voilà.Ça, c'est un gros projet.
00:51:14 :En fait, ça, c'est un projet formulaire. Il y a je ne sais plus combien de formulaire dans celui-là.Il est assez complexe.Plus simple,je voulais vous parler des transactions atomiques rapidement.
00:51:22 :C'est encore un plus vieux projet.Quand vous avez un formulaire,si je veux en parler là,ça va être l'occasion.Ici, j'ai un formulaire, par exemple.
00:51:38 :Ça va être style SAV.J'ai un formulaireoù,là, j'ai un message.J'ai un modèle message, en fait.C'est ça, un modèle message.Voilà.Dans le modèle message,il y a six mois que je n'ai pas ouvert.
00:51:56 :Il y a plusieurs choses.Bref.Il faut juste que vous dites qu'ici, il y a un messageet on peut répondre.Et quand je vais dans ma vue,est-ce que je le fais ?
00:52:08 :Voilà. C'est ça.En fait, quand j'ouvre un ticket, c'est un système de SAV.Quand la personne va poster un message,en fait, depuis mon forms,ce que je vais faire, c'est que je vais récupérertous les éléments de mon formulaire.
00:52:24 :Ici,j'utilise le champsubject.Parce qu'il faut savoir que vous pouvez très bien utiliser un modèle form.Comme ça, vous avez tous les champsde votre formulaire.
00:52:36 :Mais vous pouvez très bien, en plus,créer un nouveau champqui n'est pas lié du tout à votre formulaire.Là, ce champ-là, il n'est même pas liéà mon modèle.
00:52:46 :Ici,le champ qui est lié à mon modèleque je veux utiliser, ça, c'est un champqui n'est même pas lié au modèle que j'ai ajouté en plus.
00:52:54 :Et en fait, ce que je fais,c'est que je créeavec ce champ. Donc, j'utilise form.CleanData.Subject.C'est pour récupérerl'information qui est dans le sujet.
00:53:06 :Je m'amuse à créer un ticket.Ticket, c'est comme pour les SAV.Je m'amuse à créerun ticket. Et une fois que le ticket estcréé,je...
00:53:18 :Comment dire ?Le ticket est créé.Et mon... Comment dire ?Mon message...Mon message qui est ici.Je regarde.Je m'éperds un peu parce que je ne sais pluscombien de temps ces messages... Voilà.
00:53:34 :En fait, à mon message, ce que je fais,c'est que je lui attribue un user.Je lui attribue utilisateur reconnecté.Et je lui attribue ici, en ticket,le ticket que j'ai créé avant.
00:53:44 :Ça paraît un peu bizarre au début, mais quand vous allezbien gérer les formulaires, vous allez voir, vous allez faire un truc comme ça.En fait, on créeun autre modèle qui n'est pas liéà notre modèle avant, une instance.
00:53:54 :Après, si vous avez votre modèlequi est lié au formulaire, vous allez justement pouvoirattribuer, par exemple...Ici, c'est une foreign key.L'instance que j'ai créée avantici, donc ticket,je l'attribue à mon message.
00:54:08 :Je sauvegarde. Et du coup,ce qu'on peut faire, c'est qu'ilpeut y avoir un problème. Quand vous allez sauvegardervotre formulaire, vous pouvez avoirici votre ticket qui va se créer.
00:54:18 :Et boum, entre ça et ça,il va y avoir un bug.Et le problème, c'est que du coup, vous allez avoir un ticketqui se crée, mais sans message dedans.
00:54:26 :Ce qui n'est pas bon, et c'est complètement bidon.On peut l'utiliser avec Django, ce qu'on appelleles transactions.fromdjango.db transactions.Ça veut dire qu'ici,si vous avez un bug en plein milieu,il n'y a rien qui sauvegarde. En fait, il n'y a qu'une transaction.
00:54:40 :On peut l'utiliser en décorateurou en context manager.Avec une transaction,ici, c'est soit tout ce qu'il y a à l'intérieur se valide,tout est sauvegardé,ou rien n'est sauvegardé.
00:54:52 :Comme ça, ça vous permet,si vous avez plusieurs instancesde modèles différents,comme dans ce cas-ci, qui sont créés,soit tout est créé ensemble,soit rien n'est créé. Ça éduque les problèmes.
00:55:04 :Moi, par exemple,avec mon Florem,c'est très utileparce que quand je crée mon Florem,je l'ai mis au défaut de data,message, voilà, j'ai une transactionatomique. C'est soit le Florem
00:55:18 :se crée avecles comptes utilisateurs,les catégories, les sous-catégories,les premiers sujetset les premiers messages,soit j'ai rien qui est créé. Parce que si vous vous retrouvez ici
00:55:30 :avec un Florem qui estsauvegardé,si vous avez un bug entre là et là,c'est bidon, c'est pas bon.Donc voilà.Avec vos formulaires, je trouve que les transactionsatomiques, c'est vachement utileparce que ça vous permet de toutsauvegarder en bloc, de rien sauvegarder du tout.
00:55:48 :Là, c'était déjàun peu plus compliqué.Pour ceux qui commencent avec les formulaires Django,j'avoue que c'est un peu chaud, mais au moinsvous savez que ça existe, qu'on peut faire un truccomme ça.
00:56:00 :Est-ce qu'on a 5 minutes pour faireun petit cap-chat, récap-chat ou pas ?Sinon, on arrête là.Mais si vous voulez qu'on fasse un petit récap-chat, on peut le faire tout de suite.
00:56:08 :C'est très rapide.On va retourner sur notre...Parce que là, je suis un peu perdu,un truc un peu plus compliqué.Voilà.Ok.Ok, ok.
00:56:22 :Je sais plusce que je voulais dire en passage.Hop.Ok, ça c'est bon.Tac.Ok, voilà.Du coup, un petit récap-chat.On va utiliser un récap-chat dans notre article.
00:56:40 :On va poster notre article.Je vais partir sur la doc.Hop là.C'est Django récap-chat.Voilà, c'est ça.Il vous faut des clés d'API.On va faire un petitrécap-chat.
00:56:58 :En fait, quand vous allez surle site de Google, vous allez sur la ligne console.Ici.Les gens espèrent, les messieurs et superduses, que ce n'est pas pratique.
00:57:06 :On a l'impression de faire un get started.Mais non, en fait, ça, on n'est pas une entreprise.On va dans la ligne console.On va se faire un petit pluspour se créer un site, entre guillemets.
00:57:16 :Moi, j'en ai déjà deux de créés.On va dire que j'ai celui-là de créé.Celui-là, c'est mon test.C'est ça.Quand vous allez créer votre site,vous allez avoir une page un peu comme ça,un petit récap-chat.
00:57:30 :Vous avez vos clés d'API qui sont cachées là-dedans, mais que vous allez récupérer.Et vous mettez les domaines.Et puis, propriétaire.Vous enregistrez.Et surtout, vous prenez vos clés d'API.
00:57:40 :Google, ils sont sympathiques.Je vais vous montrer.Si vous tapezrécap-chattestkeyje l'ai mis à l'envers, bref.Je ne sais plus.Pour regarder dans la doc,ils mettent des clés test.
00:57:58 :Elles sont là.Elles sont là.J'utilise ça.Ce qui nous intéresse,c'est d'installer récap-chat.Ça va assez vite.Je crois qu'on a fini.Je vais le faire en live.
00:58:14 :C'est parti.Récap-chat.On l'installe.On n'oublie pas d'aller dans les settings.On va rajouterici.Et ça s'appelleDjango récap-chat.Copier-coller.Et ensuite, j'aidans mes settings, toujours.
00:58:44 :Je vais le mettre en bas.Les clés, je les ai mises, je ne sais plus où.Là.Ça, c'est la clésecrète.Ça, c'est pareil.
00:59:02 :J'espère que je ne vais pascouvrir.C'est pas grave.On va y arriver.On a nos clés secrètes.Je réalise la docrapidement.Ensuite, dans notre formulaire,ici, on peut faireunfrom.
00:59:24 :Il y a Django récap-chat, c'est ça..fields.Et on va importer récap-chatfield.Je crois qu'à partir de là,on est quasiment arrivé à la fin.
00:59:36 :On va se rajouter un petit champ.C'est ce que je disais. Quand on est sur un modèle form,c'est dommage, on n'a pas vu les form tout court.
00:59:42 :Quand on est sur un modèle form,on peut très bien rajouter, comme je disais tout à l'heure,des champs qui ne sont pas liés à notre modèle.
00:59:48 :Là, je vais rajouter un champ de sécurité.Cap-chat.Cap-chat égale récap-chat field.Hop.Il me semblequ'en plus, vous pouvez très bien rajouter des widgetsqui sont dans le modulerécap-chat.
01:00:04 :Je crois que c'est bon. On va essayer.Non, il y a quoi ?Hop là. Djangorécap-chat.Ouais, d'accord.Euh...Ouais, ok.Mais mon serveur s'est lancé quand même,je pense. Je ne me souvenais pas avoir
01:00:30 :cette erreur-là. Je vais essayer.Il s'est lancé, le serveur ?Non, ok.Attendez, je vais juste rajouter ça,voir si ça peut me corriger mon bug.
01:00:40 :C'est con, si je l'avais...On s'en fout d'avoir...On n'a pas dit s'il relance.Voilà, c'est bon.C'est parce qu'en fait, il nous avertitqu'il n'est pas content.
01:00:52 :C'est une clé test et c'est dangereux.Voilà, c'est ça. Donc ici,si je clique pour aller écrire un article,là, il suffit en rouge que c'est une clé testet doncne pas l'utiliseren production.
01:01:08 :On va faire un article testqui s'appelle site...Voilà, hop.Hop là.Si je clique pas, boum, ce choix est obligatoire.Et là, j'ai un bug, pourquoi ?
01:01:26 :C'est parce queje n'ai pas connecté à mon...Bon, vous avez compris le truc, mais on va le refaire juste pours'assurer de la sympathie.
01:01:34 :Hop, hop.Pour retourner dessus,on va créer un article.Ça ne fonctionne pas.Je clique,l'article est créé.Donc voilà,la récapture, en fait, ça a été très vite.
01:01:52 :J'ai fait très peu de choses.Tac, et tac.Écoutez, j'espère que ça n'a pas été...En fait, en lumière, je me rends compte que les formes lumières, c'est un peu galère.
01:02:02 :Juste,on n'a pas parlé des formes.Tant pis, c'est dommage.Je crois qu'ici, ils utilisent un forme.Non, je n'avais pas dans l'article parlé des formes.
01:02:14 :Écoutez,c'est vraiment rapide la récapture.On n'a pas forcément parlé des formes.En 30 secondes,je vais le faire vraiment en 30 secondes.Hop.Ici, dans la SAV, j'utilise par exemple,pour mes applications,c'est celui que j'ai montré tout à l'heure.
01:02:34 :Il n'y a pas un truc plus simple,un truc vraiment plus basique, un forme lumière de contact.Ça, c'est mon jeu de rôle.Je crois que...
01:02:44 :Le jeu de rôle,il y a plein de trucs partout, il est assez balèze.Je me suis fait un SAVet un forme lumière.Voilà, c'est tout simple.
01:02:54 :Ici, tout à l'heure, on utilisaitdes modèles formes, mais en fait,vous pouvez très bien utiliser des formesqui ne sont pas liées aux modèles.
01:03:02 :Là, ça va être juste des champs que je vais assicher dans du HTML.Après, ça va être la façondont vous les traitezqui va...
01:03:10 :La façon dont vous allez les traiter qui va être utile.Par exemple, mon avis de contact.J'ai mon formulaire avec tous mes champs,email, sujet, texte, security.
01:03:22 :Et en fait,c'est pareil, j'affiche monformulaire dans le template quand j'assurela méthode GET. On va finir par ça,je vous rassure.J'utilise un opérateur ternaire.
01:03:36 :Quand un utilisateur est connecté,je passe des données initialesà mon formulaire.Quand vous utilisez initiales ici,vous utilisez un dictionnaire,et ici, email, ça va êtrele champ email de votre formulaire.
01:03:50 :Et en fait, en données initiales,il va y avoir l'adresse mailde l'utilisateur qui va être déjà renseigné.S'il est connecté,hop, et sinon, c'est juste un contact formsans rien dedans. Bref.
01:04:02 :Pour précision, si on soumetle formulaire, qu'est-ce qui se passe ? Le formulaireest valide. L'email,parce qu'en fait, quand vousutilisez Clean Data,dedans, c'est un dictionnaire,et vous allez pouvoir récupéreravec vos clésles infos que vous avez besoin. Donc, je récupère
01:04:20 :l'emaildans la variable email. Je récupèrele sujet dans la variable subject. Je récupèrele texte du message dans la variable texte.Voilà.Vous pouvez très bien utiliser une méthode GET.
01:04:32 :C'est un dictionnaire,donc il n'y a pas de problème. C'est juste que moi,je l'utilise directement. Là, c'est comme ça.Et ensuite, en fait, là, par exemple,dans ce cas-là, j'envoie un mail.
01:04:42 :Voilà. Donc, en sujet, j'utilisele sujet que j'ai récupéré avant. En message,je mets de la part de Google Email,donc l'email que j'ai ici,et le texte qui est là. Hop. Comme ça, je m'envoie
01:04:52 :un email avec le message. Et ici,c'est à l'adresse à laquelle c'est envoyé.Voilà. Et ensuite,j'envoie un email à la personnequi m'a laissé un message en faisantemail envoyé. Hop.
01:05:04 :Et ici, email. Donc, c'est la personnequi a envoyé son email. Eh bien, je lui envoie un email.Voilà. Donc,vous voyez, là, il n'y a aucunrapport avec les modèles. Aucun, aucun
01:05:14 :rapport. C'est un formulaire. C'est juste un form.Mais vous voyez qu'on peut très biencréer des formes comme ça, puis après, traiter des formeset les utiliser justepourfaire du traitementd'informations, par exemple. Voilà.
01:05:28 :Voilà, voilà.Écoutez, j'espère que ça vous a plu.Vous vous rendez compte qu'en fait, une heure, c'est pas assez.Il suffit de voir un max de chosesdans une heure et j'espère que c'était compréhensible.
01:05:38 :Si vous n'êtes pas trophabitués au...Si vous n'êtes pas trop habitués au formulaire,je sais que c'est compliquéet que c'était chaud, que là, vous n'avez pas la tête.
01:05:48 :Mais si vous faites la formation à Thibault,vous revenez doucement dessus. Au fur et à mesure,vous allez voir que... Moi, j'ai mis plusieurs mois
01:05:54 :à me faire au formulaire, tellement je trouvais ça compliqué.Une fois que vous les gérez, c'est vraiment que du bonheur, quoi.Ouais, bon.Ouais, bah, merci à tous.
01:06:02 :Oh, bah, que le message soit là.Franchement, merci, c'est super sympa de votre part.Donc, voilà, bah, j'espère qu'on peut avoir une prochaine session.Je ne sais pas si elle sera sur du Django purou sur du Django avec Wagtail en plus.
01:06:12 :Je referai un petit sondage, pareil,pour voir ce qui vous intéresse.Ouais, bah, merci.Et puis, merci à tous d'être là.Et puis, aussi, à ceux qui l'enregistrent,parce que ça vous prend du temps,et voilà.
01:06:28 :Et vous êtes toujours présents pour enregistrer tout le monde.Peut-être qu'il y a Pierre Jonneur qui enregistre,je ne sais pas si il y a quelqu'un d'autre.
01:06:34 :Mais je sais déjà que Pierre Jonneur...Allô?Ouais?Bonsoir.Je t'entends...Cécile, t'es là.Ah, là?Ouais, je t'entends, Cécile.Je viens d'arriver.Tu peux partager le code, s'il te plaît,peut-être sur...
01:06:56 :Juste parce que moi, je viens d'arriver, c'est la fin.Ah, ouais, alors...Donc, ce projet-là, il est privé,c'est mon jeu de rôle, mais...Après, je peux te partager le codede l'animation, là,formulaire, mais il n'y a pas de...
01:07:10 :Un peu pour le capture, là,ça m'intéresse. Beaucoup de jeux...Ouais, OK.Écoute, on va faire un truc.Je vais faire un...Un vieux comit, je vais mettre genreCrispy, parce qu'on a ajoutéCrispy, pluscapture.
01:07:28 :Bon, je vous rassure,ce n'est pas mes clés à moi qui sont, c'est les cléstestins, donc il n'y a pas de problèmepour ça. Hop.
01:07:36 :Ouais, on va mettre le lien.Alors, c'est juste qu'il n'y a pas de readme, mais...Attendez, je vais allervous...Je vais aller juste vous donnermaintenant le chat, si vous voulez l'avance.
01:07:48 :Tac.Hop.Ah ouais, je ne suis plus connecté surChrome. Je disais Vivaldi.Ah, c'est bon. Hop, là.Alors, attendez,j'ai la blamme de trucs. Wagtail, Wagtail, c'est lequel ?
01:08:04 :C'est faire mas animation, voilà.Hop.Hop. Hop.Tac. Bon,c'est un vieux ennemi, en fait, qui est...C'était justeune note à moi, mais bon, je penseà le mettre au propre, et voilà.
01:08:22 :Donc là, vous avez tout ce qu'on a fait jusque maintenant.Là, il y a bien les captchas, normalement, si je l'enforme.J'ai le commit, voilà.
01:08:28 :Il est là. Ok.Ok, donc tu peux envoyer le lien ?Ouais, il fonctionne les captchas,donc là, il n'y a pas de problème.Ok.
01:08:38 :Voilà.Tu peux envoyer le lien ?Le lien sur... Je vais l'envoyersur le chat, là. Ouais, je l'ai mis sur le chat.Tu le vois, à droite ?
01:08:48 :Ok, je...Je crois... En plus, attends, t'embête pas.T'embête pas.Bon, il y a beaucoup de trucs de métal sur YouTube, c'est normal.Beaucoup de métal.
01:09:04 :Tac. Vos vidéos.Ah, je l'ai pas mis en public.Je vais le remettre en public. Je crois queles captchas...Tiens, si là,je te mets un lien, j'ai fait une petite vidéo de YouTubevite fait sur les captchas.
01:09:22 :Ouais, super. Mercipour le lien de ta chaîne, du coup.Ouais. Du coup, le repo,il fonctionne ou...Il est pas public ? Oui, j'avance.
01:09:32 :Ouais, c'est bon. Ok, super.Ah, mais attends, c'est bizarre.Mais moi, j'arrive pas à aller sur mon propre...Ouvrir le lien.Il y a un problème,et puis il y a un domaine habitable.
01:09:46 :C'est le lien public, pourtant.Ah non, il est pas en public, ouais.Ok, désolé.Je le passe tout de suite en...Ah bah oui, je viens de le constater.
01:09:56 :En fait, je suis allé sur mon repo.Hop, mix public,et je crois qu'il faut...Ah bah c'est bon, c'est fait.Bah écoutez, public. Bon, voilà.
01:10:06 :Voilà, c'est bon. C'est corrigé.Voilà, c'est bon, Pierre.Tu peux aller dessus, normalement, là.Je viens de le débloquer.Bah Pierre, Johnnur et Cam,encore une fois, pour les enregistrements,merci parce que, putain, c'est beau prendre du tempspour après regarder des vidéos, machin.
01:10:24 :C'est sympa.Merci.Et puis merci à tous ceux qui étaient là.Franchement, c'est sympa.On est...Je vais prévoir le prochain...Je vais prévoir le prochain sujet.
Aucune occurrence trouvée pour « ».