Session du 08 avril 2025 à 21h00
Développement Web & Frameworks
Deviens membre Premium magic_button
Cette session de mentorat est réservée aux membres Premium. Rejoignez-nous pour accéder à toutes les rediffusions des sessions de mentorat !
Premium
- check +100h de formations
- check +180 exercices de code
- check +100h de mentorats en rediffusion
- check 20 projets
- check Mentorats groupés hebdomadaires
- check Support individuel avec nos mentors
Session de mentorat Django
Nous allons voir différents sujets :
-
décorateurs
-
messages
-
transactions atomics
-
activation de compte
-
Constant
-
tweaks
00:00:00 :Est-ce qu'il faut que je zoome là ou ça va ? Pour moi ça va. Ok. Django du coup, on étaitoù ? Je me note juste parce que je voulais vous montrer différentes petites choses qui
00:00:28 :peuvent être utiles. Juste pour le rappeler pour les bases, bon ça c'est un projet queje fais pour quelqu'un mais pour l'instant il y a un compte financier, ça va se signermais il n'y a qu'une base on va dire qui pourrait être commune à plein de projetsdonc je peux le montrer là pour l'instant. Il n'y a rien qui est discuté en fait, il
00:00:55 :y a l'utilisateur et puis les projets quoi, les adresses. Donc bon. Oh, il est vissé.Salut Vissé. Bonsoir Gabriel, bonsoir à tous. Salut. Pour le retard Gabriel, excusez-moi.
00:01:18 :Non, pas de problème, pas de problème. En plus là ça va être pas freestyle mais c'étaitpas prévu donc j'ai fait un programme Django en fait et j'ai pris un projet que je suisen train de faire là qui est en cours. D'accord. Pour l'instant il n'y a rien de secret parce
00:01:35 :que ce que j'ai fait pour l'instant dedans pourrait être commun à plein de projetsdonc je peux montrer le code et après, le jour où j'avancerai bien sûr je pourraimontrer le code quoi mais là je peux encore en parler vu que c'est vraiment des chosesque j'utilise dans plusieurs de mes projets en fait on va s'en rendre bien. Ça on pourrait
00:01:55 :l'avoir dans tous mes projets quoi. Hop là, j'accepte. Donc, je disais, il y avait quelqu'unqui a devoir, ça fait longtemps qu'il n'y a pas fait de Django, donc du coup ça vapour ça les modèles ? Ouais ouais, pour ça ça va. Les modèles et dans les modèles
00:02:18 :on a les vues et les vues qui vont être rendues dans des templates HTML. Bon ça c'estle pire rafraîchissement. Et Mehdi, du coup, t'as commencé aussi. Du coup, un petit peu,
00:02:34 :ok. Déjà j'ai un bug sympa que j'ai vu cet après-midi que j'ai mis une heure àtrouver et ça devrait se trouver en 30 secondes. Je vais vous le déclencher le bug, enfin
00:02:43 :je vais vous le déclencher. Hop là, c'est là. C'est ce projet là. Bon pour l'instantil n'y a pas vraiment de compte, il est tous. Il va y avoir un menu à peu près comme ça
00:02:52 :mais en mode panier. Du coup, quand je me connecte ici, hop, bon là l'index il n'ya rien, il est vide. Quand je me connecte, que je suis sur mon profil, je vais aller
00:03:13 :gérer mes adresses par exemple. Faites pas gaffe, tout est vide pour l'instant de ceque je viens de commencer. Les adresses. Ici j'affiche du coup toutes les adresses d'utilisateurs
00:03:24 :parce que l'utilisateur peut avoir 10 adresses. Et bon, il peut savoir laquelle est par défaut.Alors tout à l'heure j'ai eu un bug de fou et j'ai mis au moins une heure à trouver.
00:03:34 :Donc pour ça, pour les adresses du coup ce que je fais c'est que ici, ma vue elle est où ? Pourles adresses ici, je vais tout simplement récupérer toutes les adresses de l'utilisateur. Dites si
00:03:49 :jamais vous allez en prendre blocage. Et je les envoie dans le contexte. Ça c'est bon pour vous ?Oui. Ok. Donc ma vue en fait, j'envoie toutes les adresses dedans que je récupère par le
00:04:01 :request utilisateur. Puisque dans le modèle adresse ici, j'ai mis un utilisateur et j'ai mis unerelation inverse. Ce qui veut dire qu'on peut faire user.addresses.all, on récupère toutes les
00:04:14 :adresses. Tout le monde n'y pense pas mais c'est très pratique cette relation inverse.Ça vous permet de créer un attribut en fait sur l'utilisateur qui s'appelle addresses.
00:04:26 :Donc voilà. J'en étais où du coup dans la vue dans les adresses. Et dans mon HTML en fait,si j'ai des adresses, au moins une adresse enregistrée on va dire en gros, je boucle et je vais afficheren fait mes adresses ici dans les cartes. Ça, les cartes, en gros c'est ce que vous avez là.
00:04:47 :Et j'ai mis en sorte, enfin j'ai mis un bouton pour supprimer qui renvoie vers une vue desuppression en fait. Donc je récupère le PK, la taille primaire en fait de l'adresse. Et je
00:05:00 :l'envoie à la vue d'élite adresse. Et donc cette vue d'élite adresse, elle est où ? Elle est là.Je reviendrai plus tard sur ce que je fais dedans. Mais en gros, je récupère l'identification de
00:05:14 :l'adresse. Grâce à ça, je récupère l'adresse et je vais la supprimer. Et en plus j'ajoute unpetit message. Donc le problème que j'ai eu tout à l'heure, c'est que dès que je supprimais une
00:05:24 :adresse, je vais vous montrer, là ça allait. Donc je supprime avec succès, pas de problème. Et c'estquand j'arrivais ici, à chaque fois que j'ai supprimé la dernière adresse, boum j'avais unlogout. Là quand on regarde mon terminal, là ici, je ne sais pas si on voit bien, j'ai un logout.
00:05:42 :Et ce qui n'est pas normal, on est d'accord. Et donc j'ai mis une heure à trouver, je ne comprenaispas. C'est bizarre parce qu'à chaque fois, dès que j'allais dans mes adresses, donc voilà,
00:05:55 :fallait que je me reconnecte. Dès que j'allais dans mes adresses, un vote en est. Et dès que jecommençais par supprimer en fait la première adresse, la première vraiment dans la boucle,j'avais à chaque fois déconnecté. A chaque fois ça me faisait ça. Du coup, pour vous,
00:06:16 :vous allez chercher où ? Un truc comme ça. Est-ce que vous avez une petite idée ?Bon sinon je lâche l'info. Dans le formulaire non ? Bah ok, on y va. C'est ce que je me suis dit
00:06:40 :aussi. Je fais dans le formulaire, mais donc je lâche dans le formulaire et c'est bien ce formulairelà. D'accord. Supprimé. Et donc je ne comprenais pas, de toute façon je bouffe, donc il n'y a pas
00:06:54 :de raison qu'il y en ait deux, trois qui soient bons et puis le premier à chaque fois qui ne soitpas bon en fait. Je ne vois pas le souci, je ne vois pas d'où il peut arriver. Je ne comprenais
00:07:04 :pas. Et en fait, il faut savoir que... Les arrêts ne commencent pas à zéro sur le templating ? Non.Tu parles de l'idée, tu parles de quoi ? Du bouclage que tu fais. Comme tu n'utilises pas
00:07:29 :d'indices, c'est sûrement pas ça. Non, non, non. En fait, c'est plus con. C'est bien chiant. En fait,avec Django... Ah, il y a Rarbox qui est là. Je l'accepte rapidement. On va continuer dessus.
00:07:46 :Parce que si je comprends bien, on finit par effrayer l'adresse par défaut aussi ? Alors,ouais, je suis d'accord, mais ça pour l'instant, adresse par défaut ou pas, moi ici, qu'elle soitpar défaut ou pas, c'est juste un attribut, mais ça ne fait rien si tu veux. Pour l'instant,
00:08:08 :je n'ai pas de méthode qui dit, en gros, si c'est celle par défaut, tu ne la supprimes pas. D'accord.Alors, je n'ai pas encore fait ça. Et au début, je faisais pas possible. Django, il le sait,
00:08:19 :que c'est une par défaut. Et donc, en fait, avec Django, vous n'allez pas réécrire tout de html àchaque fois. Vous allez avoir une base de html. Donc, par exemple, là, c'est la base avec mon
00:08:34 :menu. Je descends un peu le menu. Là, c'est grand. Voilà. Ensuite, vous allez avoir... Là,j'affiche les messages régulièrement, donc c'est pour ça que je mets ça. Et en gros,
00:08:43 :vous allez avoir votre menu. Ici, je vais avoir des blocs contenus. Donc, les blocs contenus,c'est là où, à chaque fois, je pourrais insérer tout ce qui est propre à chaque page. Et en bas,
00:08:52 :j'ai le footer. Et donc, je vais étendre ce html-là sur toutes mes pages. Je l'étends. Etici, j'ai bien mon bloc contenu. Donc, comme ça, à chaque fois, je récupère. Je n'ai pas besoin
00:09:02 :de réécrire mon menu. Je n'ai pas besoin de réécrire tout ça, quoi. Et en fait, du coup,je fais... Je ne sais pas, au bout d'une heure, je me dis, tiens, je vais regarder si en fait,
00:09:09 :ça ne pourrait pas venir de là. Et en fait, la petite blague que j'ai eue, je l'ai commentéepour vous montrer. Voilà. Ici, dans le base.html, le formulaire du logout, j'avais oublié de fermer
00:09:29 :le tag ici, le form là. Voilà. Et du coup, en fait, le premier formulaire, quand j'étais...Ça risque de remarcher. Quand j'étais là, je repars sur ma connexion. Hop là. Et en fait,
00:09:54 :quand j'étais sur le premier formulaire, lui, il était encore dans le logout ici.À la fin, il est bien fermé. Mais du coup, les autres, en fait, je pouvais les supprimer. Mais
00:10:05 :celui-là, en fait, il est encore dans le logout pour lui. Donc, voilà. C'est vraiment... Enfin,je voulais vous le montrer parce que ça, c'est un coup à... Quand vous avez des choses dans le base.html
00:10:16 :que vous étendez et que des fois, vous ne comprenez pas, en fait, ça peut venir de là.Donc, c'était juste une balise forme qui n'était pas fermée ici. C'est à vous, va, ou pas ? C'est
00:10:26 :bon ? Oui, oui. Du coup, c'est l'imbrication. En fait, oui. Du coup, c'est l'imbrication qui faitqu'on ne pense pas le garder. Ouais. À remettre en cause tout l'affichage, quoi. C'est ça. Donc,
00:10:41 :c'est pour ça que je voulais en parler parce que je... Peut-être qu'il y en a qui l'auraientvu direct avec Kardia. Mais en fait, j'aurais dû y penser direct puisque c'est le logout qui se
00:10:48 :faisait. Et j'aurais dû me dire, tiens, je vais voir le formulaire du logout. Mais des fois,on est un peu borné quand on code toute l'après-midi, toute la journée. Donc, on ne va pas voir.
00:10:56 :Et du coup, voilà. Donc, maintenant, il n'y a pas de problème si je le supprime. Logiquement,j'ai mis à jour. Voilà. Je n'ai aucun adresse enregistrée. Je suis bien à ma vue. Bon, voilà.
00:11:08 :Ça, c'est la première chose que je voulais vous montrer. C'était un petit truc sympathique. Est-ceque je peux passer à la suite ou pas ? Oui ? Ok. On va avoir deux... C'est une question,
00:11:22 :vous le dites. On va avoir deux petits concepts. Du coup, je voulais partir sur les décorateursque j'ai. Ok. Autre chose sympathique qu'avec Django, vous avez un décorateur qui est où ? Donc,
00:11:41 :déjà, vous avez le LoginRequired. Excusez-moi pour l'anglais. Et vous avez le RequireHttpMethod.Voilà. Donc, en gros, bon, les deux sont indépendants, mais je vais vous montrer ce que je fais avec.
00:11:55 :En gros, le LoginRequired, ça fait en gros que si vous voulez accéder à une vue,imaginez que vous tapez l'URL comme ça dans le navigateur, même si elle n'apparaît pas dans lemenu, et bien ça va automatiquement vous rediriger en fait vers une vue de, je vais vous montrer par
00:12:19 :exemple celle-là, vers le login. Par exemple, celui-là, je me suis déconnecté, je vais rentrerl'URL directement, et hop, j'ai bien ici mon paramètre Account Addresses, mais je suis dansla vue de Login, ce qui fait que quand je vais me connecter, je suis redirigé automatiquement sur la vue à laquelle
00:12:40 :je voulais accéder. Ça va, ça ? Oui, ok. Donc, pour que ça marche, par contre, je crois qu'il y a un paramètrenormalement que vous pouvez mettre ici, qui est LoginURL, voilà. Vous pouvez spécifier vers où vous voulez
00:13:04 :envoyer le login, mais moi ce que je préfère faire, au lieu de me retaper tous mes logins à chaque fois dans leLoginURL, je vais dans, il est où, mon dossier projet, il est là, mon dossier Settings, et on peut définir,Yarsel, Disconnect, c'est bon. Salut Yarsel. Salut tout le monde. Désolé pour ces gros retards. Pas de problème. Bon là, j'ai bien avancé,
00:13:42 :mais t'as juste loupé un bug, une résolution de bug, ça aurait pu être facile à résoudre. Du coup,je disais, oui, mon, hop là, j'en étais où, la vue, la vue qui est là. Donc, quand vous avez un login en Corel Red, ici,
00:13:59 :vous pouvez définir la LoginURL, qui est là, en Settings, en constante, et quand vous définissez ça, le décorateur, il va directementaller vous rediriger vers votre vue de login. Donc, en fait, pas besoin de définir dans chaque décorateur. Et ma vue de login,
00:14:18 :moi, elle est ici, donc je l'appelle Login. Est-ce que, j'aurais dû laisser mes Settings ouvertes, qui sont où ? Est-ce que vous savezpourquoi ici, parce qu'on est d'accord que ma vue de login s'appelle Login ? Vous êtes d'accord ? Oui. Mais, est-ce que vous savez pourquoi
00:14:42 :je l'appelle Account, de petit point, Login ? Non. Alors, parce que, normalement, si vous ne mettez que Login ici, votre vue s'appelle Login.Oui. C'est peut-être parce que tu as tiré de l'application Account. T'as dit quoi ? Il est directement appelé de l'application Account,
00:15:20 :quand vous mettez un nom ici, à chaque fois, votre vue, elle va s'appeler Account, de petit point, signé App, Account, de petit point, Activate,et ainsi de suite. Activate. Comme ça, si jamais vous avez deux applications où vous avez, je ne sais pas, où vous avez potentiellement,
00:15:34 :il faut avoir le même nom, je ne sais pas, deux Activate quelque part, vous aurez Account, Activate pour l'application Account,et l'autre Activate pour votre application. Ça, c'est bon ? Ok. Alors, il y a quelqu'un qui veut rejoindre. Et donc, je continue.
00:16:24 :Require HTTP methods. Et à l'intérieur, vous mettez les méthodes qui sont, entre guillemets, autorisées pour la vue. Donc moi, par exemple,je ne veux surtout pas que quelqu'un y accède par une gate ici. Donc, si je relance mon serveur, elle s'appelle, je ne sais même plus d'ailleurs,
00:17:50 :l'idée de l'adresse. J'utilise la fonction getObjector404 pour récupérer l'adresse supprimée. Donc, j'aurais très bien pu faire une requête,adresse.object.getPK égale adresse idée. Mais j'aime bien utiliser cette fonction là, parce que, bon, c'est assez court et ça me renvoie une 404,
00:18:35 :que je récupère, donc si l'attribut user de l'adresse, il est différent de l'utilisateur qui fait la requête, ici. Et donc, dans ce cas là,vous pouvez faire, il est où, vous pouvez importer une exception qui s'appelle permission des niens, ici, et ça, en fait, ça renvoie une 403.
00:18:54 :Donc, c'est, en gros, vous n'avez pas la permission, quoi, je crois qu'on appelle ça. C'est interdit. C'est forbidden, ce 403, c'est.Et donc, vous pouvez, du coup, avant d'aller supprimer la ressource en question et de faire le boulot, vous pouvez directement stopper l'action dans la vueet renvoyer cette exception là, et avec Django, ça stop tout. Le mec, il se fait éjecter. Est-ce que ça va pour tout le monde, pour l'instant ?
00:19:44 :En gros, quand tu vas, ça aurait été bien que je te montre l'exemple avec les débugs carrément de Django, ce serait cool.Si je vais créer, je ne sais pas, si je vais créer, par exemple, on va aller faire ça tout de suite, comme ça. Allez, hop, on va aller créer.
00:27:13 :La boucle, elle a raison d'être parce que tu peux avoir plusieurs messages. C'est ça, dans la suite d'attente, pour le user en cours ?Oui, pour avoir plusieurs messages, oui. D'accord, ok. Ou le fait de faire des un-messages, ici. Ok, plusieurs messages. Et donc, il y a un moyen à imaginer, vous avez un... Alors, je ne sais pas si je vais le retrouver comme ça parce que c'est un projet, j'étais vraiment... Même si c'est mon projet préféré, j'étais très débutant.
00:28:18 :Ah, tu fais un ctrl F, le message ?Ouais, mais est-ce que je vais... Putain, on a un report. Non, je ne m'en vais pas ici. Non, il ne me retrouve pas ici, alors. On va regarder en attaque, peut-être. Dans les vues, là. Ouais.
00:28:54 :Dans l'IDE, il y a un moyen de rechercher dans le projet complet ?Ouais.Au moins dans le dossier vues.Je réfléchis parce qu'en fait, je ne sais plus si je les ai mis directement dans les messages. Je ne vais pas perdre trop de temps, en fait, parce que je les ai mis dans les classes qui gèrent la bataille et tout, je ne sais plus.
00:29:46 :Donc, je ne sais pas, dans Python, vous pouvez directement aller boucler sur vos messages et comme ça, ça va les effacer, en fait.Je ne sais plus si je les ai là-dessus. Ce n'est pas le plus important, mais je ne sais pas s'il y a encore mon exemple, je vous l'aurai donné.
00:30:40 :Et ça les supprime.Ah oui, d'accord.Vous ne les affichez pas.Donc, le fait de les scanner avec le fort, ça les épile, ça les retire.
00:31:06 :Parce que je ne voulais pas afficher des messages dans l'abandon de la partie.Donc, voilà pour ça. Est-ce que c'est bon pour vous, ça ?
00:31:14 :Oui, c'est bien. Merci pour le tip, ça.Ces trucs ne sont pas toujours très connus, mais ils sont super pratiques, je trouve.Mais, en fait, du coup, l'import de messages, tu as installé quelque chose avant, ou ça fait partie de Django aujourd'hui ?
00:31:33 :Non, non, ça fait partie de Django.D'accord. Parfait, parfait.Non, il n'y a pas de problème.Est-ce que vous connaissez, bon, avant, encore deux ou trois petites choses, et puis après, je ne vous embête plus, mais est-ce que vous connaissez les transactions atomiques ?
00:31:51 :Pas du tout.Je ne sais pas, c'est des termes que je ne connais pas.Ok. Par exemple, j'en utilise où ? Je réfléchis.C'est quoi ? C'est de la base de données ?
00:32:07 :Oui. En gros, c'est ça. En gros, imaginez, là, je ne sais pas, vous avez la vue d'inscription.Donc, j'ai un formulaire. Si mon formulaire, en gros, si l'utilisateur m'envoie des données, si elles sont valides, je sauvegarde, en fait, l'utilisateur en base de données,
00:32:27 :mais je crée en plus un profit parce que ça m'envoie de la part.Donc, je pourrais très bien créer des signaux dans Django, ce que j'ai déjà fait, qui détectent quand un utilisateur s'inscrit que ça crée un profit tout seul.
00:32:42 :Moi, je préfère, en fait, le faire sans signal. Dès que je peux éviter un signal, j'évite.Et je crois que, d'ailleurs, c'est recommandé par Django, même par la doc, éviter les signaux.
00:32:55 :Et je préfère créer mon profil en même temps que je crée l'utilisateur.Donc, dans la même vue et avec mon formulaire.Donc, le problème, c'est que, imaginez, si je n'ai pas la transaction automatique ici, on dit qu'on ne l'a pas.
00:33:07 :C'est un context manager que j'ai là.Si je ne l'avais pas, donc, j'aurais directement tout ça, là, dans mon form, et je valide.Le problème, c'est que, c'est très peu probable, mais imaginez, vous avez l'utilisateur qui se save ici,mais vous avez un bug entre là et là.
00:33:27 :Donc, le problème, c'est que vous pouvez avoir l'utilisateur de sauvegarder en base, mais son profil qui, lui, n'est pas sauvegardé.Donc, le souci, c'est que, c'est que, en fait, s'il y avait plein de montres qui s'inscrivent sur la plateforme, ainsi de suite,ça peut vite devenir le bazar.
00:33:47 :Donc, pour ça, il y a, justement, la possibilité d'importer ici transaction.Moi, ce que je fais, c'est que je prends de quoi un context manager.
00:34:06 :Ça peut s'utiliser en décorateur aussi.Donc, moi, j'aime bien le prendre en manager avec que la partie dont j'ai besoin.Oui, donc, si jamais j'arrive ici et qu'il y a un bug entre les deux, et bien, en fait, il n'y en a aucun des deux qui sauvegarde.
00:34:20 :C'est soit tout ou rien, en fait.Ah oui, il le protège, en fait.Oui.OK.Donc, en base, vous avez soit tout, soit rien.Voilà, c'est comme ça.
00:34:28 :Au moins, c'est clair.Il n'y a pas…Enfin, il y a un problème, mais au moins, il n'y a pas de demi…Enfin, vous n'avez pas un utilisateur sans profil de créé, quoi.
00:34:36 :Voilà.D'accord.C'est bon pour vous, ça ?Oui, c'est excellent.Merci.Est-ce que je parle d'évaluateur ?Mais t'es pris la tête.Moi, en fait, c'est une bonne idée de faire un modèle à part pour le profil.
00:34:57 :En fait, moi, j'avais oublié.J'avais essayé de faire une gestion du user comme ça.Je me suis enlisé.Mais oui, je comprends mieux comment tu fais, là.
00:35:08 :C'est mieux.Ben, oui.J'aime bien, en fait, faire ça.Vraiment avoir mon modèle utilisateur, ici, que je customise.Il n'y a pas besoin de customiser.
00:35:19 :Mais j'ai un profil à part qui est relié en one-to-one.Oui, il est en one-to-one.C'est bon, c'est super.Qui est relié en one-to-one.Et comme ça, en plus, c'est facile.
00:35:33 :T'as l'utilisateur, tu fais user.profile.e-seller, si on veut savoir, par exemple.Il y a ça.Oui, carrément, c'est pratique.Je voulais te parler de ça, ou pas.
00:35:51 :Peut-être pas.Ici, j'utilise un singleton.Mais en fait, ça peut se rapprocher, pour ceux qui connaissent, du pattern constant.Non, j'en parlerai peut-être plus tard de ça.
00:36:06 :Je n'ai pas revu les patterns.Je ne les connais pas tous.J'en connais quelques-uns quand j'en ai besoin.Après, quand tu es habitué à avoir un code propre et découpé,tu te rends compte que quand tu regardes des patterns,tu te dis que ça, je le sais déjà.
00:36:24 :Ça, en gros, c'est pour ne pas avoir des valeurs dans le duret tout gérer pour ne pas aller changer des valeurs partout dans mon code.
00:36:32 :C'est gérer à un seul endroit.J'ai un load ici qui va me chercher une instance précise d'un singleton.D'accord.Et qui me récupère les valeurs.
00:36:42 :Mais bon, ça, je ferai revenir dessus plus tard.Django Tweaks, je vous en parlerai plus tard.Et on va finir peut-être le validateur.Ça va être sympa.
00:36:52 :Quand vous avez des champs comme ça.Voilà, ici, par exemple.Vous avez le firstname et le lastname.Vous créez un projet.Sauf que le problème, par défaut, un champ encartile comme ça,votre firstname, l'initiateur peut très bien envoyer un 2, 3, 4, 5et le lastname, 7, 8, 9, 10.
00:37:13 :Ce qui est un peu débile.Du coup, ce que je fais, moi, c'est que je me rajoutece qu'on appelle un validateur.C'est un que je crée moi-même.
00:37:25 :Donc, je passe ici par validator.Vous me dites si jamais vous avez un doute.Et donc, mon validateur, ici,ce que j'aime bien faire, moi, c'est découper mon code.
00:37:39 :Non, j'ai pas eu d'encores.Je replie un peu tout ce que j'ai fait.Donc, je me suis créé un module validateur.Pour l'instant, j'en ai qu'un, mais je pourrais en avoir plusieurs.
00:37:52 :J'ai une regex.Je suis un peu élargi du cas de regex.J'ai une regex, ici, qui me permet, en gros,si je ne peux avoir que des lettres, des espaces et des tirées.
00:38:02 :Voilà, en gros, c'est ça.Donc, si jamais quelqu'un envoie des chiffres dans le champ,il va, ici, passer à travers la regex validatoret il va avoir cette erreur-là.
00:38:15 :Pour vous montrer, mon validateur, ici,je l'importe ici dans mes modèlespour l'utiliser ici.Donc, par exemple, là,j'utilise peut-être...Je devrais... Non, j'utilise l'adresse.
00:38:28 :Non, il peut y avoir des nombres.Donc, non.Donc, je disais, j'utilise ici.Donc, firstname, lastname.Et donc, par exemple,mon renseigneur, il est là.
00:38:38 :Si je vais dans...Inscription, j'envoie mon email.On va le modifier un peu parce que celui-là existe déjà.Et on va mettre un mot de passequi pourrait exister.
00:38:58 :Logiquement, j'ai une erreur.Voilà.Et donc, en fait,automatiquement, lui,il va aller me mettre l'erreur ici,le message d'erreurque vous avez défini,que j'ai montré tout à l'heure,que vous avez défini, en fait,directement dans votre validateur, ici.
00:39:17 :Excellent.Comment est fait...Comment est fait le lien avec ta page ?C'est-à-dire ?Là, en fait,je vois bien qu'on paramètre icila raison de l'erreur,on va dire.
00:39:39 :Oui.Mais,dans ta page,si tu reviens dans ta page HTML,il s'affiche en dessous.Comment c'est géré, ça ?Ah, oui, OK.Oui.Pardon, je ne suis pas clair.
00:39:56 :Excuse-moi.Non, pas de problème.Donc, validateur qui est envoyédans Validators,comme ça,dans mes champs.Alors, c'est dans mes champs de modèles,c'est ça le pire.
00:40:05 :Donc, ce n'est pas dans les formulaires,c'est dans les champs de modèles.Sauf que,sauf que,j'utilise un custom user expression formqui, lui, va aller chercher, en fait,mon modèle.
00:40:20 :Donc, il va intégrer toutes ses...toutes ses validations.Euh...Bon, là,on en parlera plus tard de ça.Ça ne nous intéresse pas pour l'instant.
00:40:32 :Ce qui nous intéresse, c'est vraimentde dire que le formulaire, lui,va intégrer les validations.Parce que c'est un user expression form.Et si je regarde,j'ai un base user expression form,je vais appliquer quelque chose vite fait.
00:40:43 :Voilà.Donc, qui est dans l'héritage,on retrouve ici ce qu'on appelle un modèle form.Un modèle form,vous pouvez souvent l'utiliser.Vous avez form.modelform,et moi, par exemple, j'utilise un form.form.
00:40:58 :Mais il faut savoir que, du coup,il existe les modèles form.Oui.Donc,c'était quoi, du coup, le modèle form ?Voilà.Et donc, je vous disais quoi ?
00:41:11 :Donc, voilà.Donc, ça prend en compte nos validations.Et donc, c'était le signup.Donc, on va chercher le signup.Et alors là,en plus, je l'ai modifié récemment.
00:41:23 :Là, j'ai peut-être piqué un truc,un bout de casativeau.En gros, ce que je fais,on est où ?Là, on est dans le formulaire qui commence ici.
00:41:34 :Je parcourstous les champs du formulaireparce qu'en fait, du coup,alors oui, pour commencer,ma vue, elle est là.J'utilise mon custom user expression form ici,et je l'envoie en contexte, en fait, ici.
00:41:47 :Donc,en l'envoyant dans le contexte,je le récupère ici.Donc, je boucle sur les champs.Et là, sur les champs,j'affiche le label.J'affiche le champ lui-même.
00:42:02 :Ici, j'ai des erreurs.Et donc, pour chaque erreur,en fait, je boucle sur les erreurset je vais aller les afficher ici.Simplement.En fait, c'est ça qui est énorme avec Django,c'est que vous gérez tout dynamiquement, en fait.
00:42:18 :Ça va ou pas ?Waouh !Ouais, ouais.Ou c'est chaud, compliqué ?Ouais, non, c'est bien,mais j'aurais pas trouvé,j'aurais pas trouvé le lien,mais ouais, d'accord.
00:42:34 :Ouais, ouais.En plus, moi, à la base,je faisais beaucoup plus simplement.Il y a beaucoup de fois, tu verras,vous verrez, en fait, dans la template,juste utiliser le tag form.
00:42:47 :Et en fait, form, ça suffitpour afficher tout le formulaire.C'est juste que là,il y a les customisations,donc ça, je l'ai piqué à Thibault.
00:42:54 :C'est lui qui me l'avait expliqué, ça.Et en fait, on peut boucler,ça s'écrit dans la doc, je crois,on peut boucler, en fait, sur les champs,au lieu d'envoyer vraiment tout le formulaire,voilà, comme ça,on l'envoie dans la page,on pourrait très bien écrire,comme ça, form,
00:43:13 :et là, on aurait le formulaire affiché,pas de problème.Il serait affiché.Sauf que là,et en plus,il afficherait les messages derrière aussi,sans problème.
00:43:23 :En fait, ça, il le fait,ça, c'est vraiment juste pour customiser,parce que ça, il le fait en arrière-plan,avec la balise form,tout simple, il le fait aussi en arrière-plan.
00:43:30 :C'est juste que moi,j'avais besoin de pas mal de customisations,donc c'est pour ça qu'il fait ça.Donc voilà.C'est bon, ça, ou pas ?
00:43:41 :Oui, merci.Super.Et puis bon, après, comme ça,on verra,on peut même envoyer ici des classes CSS par le Python.Voilà, les classes.On peut même,qu'est-ce que je fais ici,le login,j'envoie même des classes CSS par un filtre,que j'ai importé via Django UX.
00:44:06 :Voilà, il y a plusieurs façons de faire, en fait,selon le besoin de personnalisation.Donc voilà, c'est ce que je voulais,je voulais vous montrer ce soir,un peu de ces petits tips Django.
00:44:18 :C'est bien.Franchement, c'est bien.Merci.Merci, gentil.Django, après, je suis,ça fait longtemps que je l'en fais,et j'adore ça.Et puis là, c'est super important,parce que, je veux dire,souvent, quand on démarre une appli,même si, au départ,j'avais négligé les users,mais après, c'est évident d'avoir,
00:44:45 :enfin, c'est quand même mieuxd'avoir une gestion du user, quoi.Ouais, complètement, ouais.Du coup, ça évite plein de pièges.Vraiment, merci, c'est bien.Ça fait plaisir, merci.
00:44:57 :C'est sympa.Merci pour les messages.Et ouais, j'espère que vraiment,ça vous a plu,que vous me dites si c'est trop long,trop compliqué,ou, voilà, vous pourrez faire autre chose,il n'y a pas de soucis, moi, je suis ouvert.
00:45:10 :Il y a Aravox, je pense à toi.Merci pour les messages.Oui, Aravox, je t'en parlerai après.C'est une question générale.J'ai découvert ça récemment,mais je ne suis pas trop allé très loin.
00:45:30 :Les caches,est-ce que l'important,c'est les caches avec Django ?Cacher une vie, un sujet template,un truc comme ça.Les caches avec Django,moi, je ne les touche pas.
00:45:46 :Je ne customise jamais plus que ça.J'en connais qui faisait beaucoup avec Quacktail,mais je crois qu'ils utilisaient un module Django.Pourquoi tu pensais à faire quoi avec ?
00:46:00 :Je suis tombé dessus sur Internet,et je me suis dit que c'était important, vraiment.Je lisais et je me suis dit peut-êtreque tu l'as déjà utilisé.
00:46:11 :Tu connais vraiment son importance dans les fonds.Non, non.Après, tu peux utiliser le cache customisé,mais je ne sais pas.Avec un exemple.Je sais qu'on peut optimiser le cache.
00:46:30 :Certaines parties du cache,je ne sais pas si on peut tout gérer comme ça,mais on peut utiliser Redis pour le cache,et vous déléguer pas mal de choses comme ça,un petit broker, et ça peut être plus efficace.
00:46:46 :Je l'ai fait une fois.Je ne sais plus pourquoi, d'ailleurs.Mais le cache, sinon, en moyenne,je ne touche pas tellement.Honnêtement.Je réfléchis juste à...
00:47:00 :Parce que vous avez Redis qui peut stocker les...Déléguer, en fait, une partie à Redisqui peut stocker des choses en mémoirepour que ce soit plus performant.
00:47:13 :Mais à part ça, sinon, je ne touche pas trop.Ah, d'accord.Je n'ai pas trop suivi la session.Je vais sûrement revenir en diffusion.Mais les décorateurs que tu viens de parler,ça s'applique aussi sur les vues basées sur les classes ?
00:47:29 :Parce que moi, les fonctions, je n'utilise pas trop.J'utilise trop les vues basées sur les classes.Oui, tu peux utiliser les décorateurs, complètement.Il n'y a pas de souci.
00:47:38 :Moi, je le fais...Je me demande si je ne le fais pas sur mon site perso, d'ailleurs.Je ne sais même plus si j'utilise le site,mais je crois que je dois le faire, oui.
00:47:50 :Je regarde rapidement si je peux te répondre comme çaet je te montre rapidement.Open.Est-ce que j'ai...Est-ce que j'ai quelque chose ici ?
00:48:02 :Hop là.Alors.Custom user.Est-ce que j'ai mes vues qui sont là ?Méthode décorateur.C'est un décorateur pour quoi, par exemple ?Tu penses à toi ?
00:48:18 :Tu viens parler d'une...Je ne sais pas trop.Quelque chose qui détermine la méthode de la vue.Oui, d'accord.Oui, donc tu as une vue dédélite.
00:48:28 :Oui, donc tu peux faire ça.En fait, tu peux le faire aussi avec les vues.Mais là, par exemple, moi je vois que j'ai des vues en classequi utilisent en fait...
00:48:37 :Je regarde en même temps le cache.Hop là.Rapidement.Rapidement, rapidement.J'ai un projet, moi, où je fais tout,quasiment tout en vue par les classes.
00:48:55 :Et en fait, je vais ici avoir mon décorateur.Il va en fait aller cibler la méthode dispatch de ma vue.Et comme ça, en fait,ici je sais que, par exemple, pour cette vue-là,il n'y a que les personnes qui sont adminsqui peuvent accéder à cette vue-là.
00:49:13 :Voilà.Après, tu pourras avoir des...Utiliser de l'héritage pour avoir du login, par exemple.Donc c'est du login au Corel Mixin.Ça dépend de ce que tu veux utiliser, en fait.
00:49:30 :Voilà.Ça, c'est vraiment intéressant.Bon, par rapport au décorateur,je crois que c'est LoginRequirementsqui est ici sur les fonctions.Maintenant, les paramètres,je ne sais pas trop,c'est LoginMaxin pour protéger la vuequ'on accède par les utilisateurs connectés.
00:49:56 :Maintenant, là, ça fait juste tous les utilisateurs.Ça ne catégorise pas les utilisateurs.Si, par exemple, tu as trois types d'utilisateurs,là, ça fait du général.
00:50:09 :Oui, LoginRequirements, c'est vraiment un loginpour tous les utilisateurs, oui, c'est ça.C'est pour tout le monde.Si tu veux maintenant les séparer,c'est mieux d'utiliser un décorateur.
00:50:22 :Moi, par exemple,si j'avais fait sur un projet, je crois,où j'avais des permissions,c'était par décorateur ou pas que je le faisais ?Je ne sais plus.
00:50:39 :Attends, non, c'est permissions.Je ne sais plus lequel c'était.Permissions requirées, c'est peut-être ça,je ne sais plus, décorateur.J'utilisais un décorateur.Je vais retourner sur l'autre projet vite fait,mais je crois que tu peux avoir un décorateur pour ça.
00:51:02 :J'étais où ici ?J'utilisais où mon décorateur, là, ici, je crois ?Hop là, point haute.Et ils sont mes décorateurs.Là, il n'y a pas un permission.
00:51:15 :Je crois que c'est un permission.Oui, c'est ça.Permissions requises, ici.Et on peut insérer dedans la liste des permissions.C'est ça.C'est possible, du coup.
00:51:29 :D'accord, je vais d'abord essayer.Merci, Gabi.C'est normal.Donc, voilà.C'est bon pour vous, du coup.Je vais couper la présentation.Et donc, je dis, je vais faire plus sur de la PO pure,juste pour ceux qui commencent, entre guillemets, la formation de Python,ou qui sont même déjà peut-être plus avancés.
00:51:59 :Je pense à Aravox, si je ne dis pas de bêtises.Toi, ça ne fait pas longtemps qu'elle a commencé.Oui, ça ne fait pas très longtemps, oui.
00:52:06 :C'est assez impressionnant de voir tout en code, là.C'est assez intimidant, entre guillemets.Après, quand tu seras habitué à en faire, tu verras.Tu auras l'habitude.
00:52:23 :Non, mais on va revoir les classes, ce soir-là.C'est jeudi.Et en plus, j'ai parlé avec quelqu'un qui était,pareil, qui commençait et qui est avec la PO,même deux, trois personnes comme ça,qui disent à chaque fois que c'est la PO qui les embête.
00:52:41 :Donc, ce serait pas mal de revoir ça.Je confirme.Tu feras du PO avec Django, ou bien PO Python ?PO pure Python.Ah, d'accord.
00:52:54 :Ouais.Désolé, je pensais que tu voulais du Django, toi.J'en reprendrai la semaine prochaine.Ah, d'accord.Parce que j'aimerais bien savoir,parce qu'avec la PO, tous ces héritages,je me disais, c'est bien, c'est possible d'hériter,et voir du PO avec Django.
00:53:14 :Ah, ouais, ouais.Ouais, bonne soirée, Baptiste.Mais...Et de voir, t'allais dire quelque chose, je sais plus.Non, non, non.Que je confirme mes difficultés avec l'orienté d'objet.
00:53:31 :T'as des difficultés avec, toi, tu disais ?Non, non, que je confirmais qu'avec la PO, j'ai beaucoup de mal.Ah, t'as beaucoup de mal ?
00:53:39 :Ouais, ouais, ok.De toute façon, je t'ai trouvé vraiment des trucs parlants,et sans partir trop loin,peut-être avec des petits exemples de composition,un truc dans le genre d'agrégation, je sais pas, je vais voir,mais très léger,et voir qu'en fait, c'est pas si sorcier que ça,à comprendre, en fait.
00:53:56 :Moi, c'est plus les termes, en fait, qui me...Ok.Avec lesquels j'ai du mal, en fait.Ok.Bah, hésite pas à m'envoyer un message,ou à voir quels termes, qu'est-ce qui te fait le plus galérer,y'a pas de soucis.
Aucune occurrence trouvée pour « ».