Session du 17 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 parler des signaux.
00:00:24 :Ce soir, on va parler en partie des signaux. Est-ce qu'il y en a qui connaissent ?Pas du tout, ça va être génial de voir ça.
00:00:38 :Pas du tout, non.OK, c'est cool alors.Les signaux, comment les définir ?Avec des événements comme des hooks, des crochets, vous avez des émetteurs.
00:00:58 :Par exemple, vous avez un modèle qui peut être émetteur, vous avez votre modèle Django.Et quand vous faites un save dessus, ça peut déclencher une action, mais une action qui est écrite autre part dans le programme.
00:01:13 :C'est ça qui est assez énorme, mais à la fois, attention, parce que ça peut peut-être être le bordel avec ça.Parce que si vous avez des émetteurs et des receveurs un peu partout et que ça vous fait des actions et que vous ne savez plus d'où ça vient, ça peut vite devenir être dangereux.
00:01:27 :Je vais commencer par vous montrer ça.J'ai un projet, je vais partager mon écran déjà.Je peux faire une fenêtre entière par exemple.Vous voyez bien là ?
00:01:46 :Oui, parfait.J'espère qu'il y a Franck qui va réussir à nous rejoindre, le pauvre.Du coup, là en fait c'est un projet vraiment bidon. Le blanc, si vous ne me faites pas trop les yeux, ça va, c'est comme ça.
00:01:59 :Vous voulez que je change ?Je remets en noir sinon.Je ne suis pas trop fan du blanc, mais...Ah non, bien, bien, c'est super.
00:02:11 :Même moi, c'est...Ah non, il n'y a pas de problème.Voilà, on est mieux ?Ah yes, merci.J'étais en blanc en ce moment, je ne sais pas pourquoi.
00:02:22 :Mais c'est vrai que quand je repasse en noir, en fait, c'est plus sympa.Du coup, c'est un projet tout bidon et je n'ai quasiment rien fait dedans.
00:02:32 :Vous voyez, il y a juste une application Account.Avec un modèle User Custom, parce que quand vous faites un modèle User Custom, je ne sais pas si tout le monde sait,mais il faut le définir dans les settings.
00:02:41 :Donc, en chaîne de caractère, j'ai le nom de l'application, Account.Et...Elle est là.Et j'ai mon environnement virtuel qui ne s'est pas activé, pourquoi ?
00:02:56 :Génial, ok, parce que...Ah oui, j'ai eu un problème alors, attendez.Attendez, je vais faire un truc, je ne sais pas le faire là-dessus.Quoi que je dise.
00:03:10 :Je sais pourquoi il m'a fait ça.Putain.Voilà.Avec PyArm, ça se fond de la merde quand tu as un problème de version avec Python, ça c'est chiant.
00:03:24 :Voilà, donc si je requitte...Et là, je pense qu'il va me le retrouver.Voilà, il me prend bien le verre en vie.Ok.Sauf qu'il faut qu'on reinstalle Django.
00:03:37 :Si je recommence, foutez Python.Signal.Ok.Hop, c'est parti.Ok.Pourquoi il ne me prend pas... Ah, c'est bon, j'ai eu peur.Ok.Normalement, il y a tout ce qu'il faut, j'avais que Django de base installé.
00:03:56 :Du coup, je disais, j'ai un modèle utilisateur custom.Je ne sais pas si vous savez, par exemple, le champ Username, j'ai mis None,c'est-à-dire qu'il n'y a plus de champ Username.
00:04:07 :Il est supprimé.J'ai redéfini le champ Email, parce que j'aurais très bien pu utiliser l'abstraction,donc j'ai déjà un champ Email de fait ici.Et en fait, je le redéfinis parce que je veux un unique asso.
00:04:21 :Comme ça, on ne peut pas avoir deux mêmes emails en compte.Voilà.En UsernameField, je redéfinis Email.Et puis, je mets un champ Requi, où j'aurais pu les enlever d'ailleurs,FirstName, LastName.
00:04:32 :Ce n'est pas forcément utile de mettre ça, mais bon.Voilà.Et j'ai un manager custom pour gérer la création des méthodes CreateUser et CreateSuperUser ici.
00:04:41 :Ce n'est pas l'objet du mentorat, mais je vous présente un peu le truc.Et voilà.Et donc dans Settings, j'ai bien ici Account.CustomUser,donc l'application Account et la classe CustomUser.
00:04:54 :Voilà.Du coup, pour les signaux, on va s'amuser à créer une classe en dessous,pour avoir un exemple concret.Alors, juste enlever ça, parce que des fois, ça me saoule un peu.
00:05:12 :Voilà.Et on va mettre, je ne sais pas, en User, on va mettre l'utilisateur en one-to-one.Donc dites-moi si vous n'êtes pas à l'aise avec tout ça.
00:05:24 :Bon, j'ai mon CustomUser, je dirais qu'ici.Mais je pourrais plutôt faire un...Bon, on va prendre l'exemple ci pour être propre.From django.conf.Import frogsit settings, etc.
00:05:45 :Et dans les settings, vu que j'ai défini OutUserModel, ici, modèle.On peut faire tout égale settings.outUser.Comme ça, c'est plus flexible.Voilà.Excuse-moi, et du coup, dans ta constante, t'as défini quoi ?
00:06:07 :Dans ton fichier setting.py, t'as défini quoi ?Le modèle qui va être utilisé pour mon projet.Oui, d'accord.J'ai mal expliqué tout à l'heure, excuse-moi.
00:06:20 :Donc, celui-là.Et donc, ça permet de l'appliquer dynamiquement, en fait.Dans son projet, c'est plus propre de passer comme ça par les settings,et de passer par la constante qui est là.
00:06:30 :Oui, d'accord.Voilà.On va mettre un modèle.casper.Vous me dites si vous n'êtes pas OK, s'il y a un truc qui vous choque.Hop, on va l'appeler, du coup, utilisateur, ici.
00:06:47 :Pour l'instant, j'ai caché ça.Et je voulais mettre quoi ? Un champ bidon ?Je ne sais pas, c'est l'heure.J'espère d'avoir un champ, quand même.
00:06:54 :Ouais, on va faire ça.Hop.Un boolean field.Tac.Et on va l'appeler...On va le mettre en défaut.Et voilà.Je vais mettre vendeur.
00:07:10 :Enfin, et vendeur.On aurait pu mettre...Peu importe.Donc, voilà.On a déjà, du coup, deux modèles.KitAmuser et Profile.Ce qu'on va peut-être faire maintenant.
00:07:20 :Du coup, on va se le regarder.On va faire une migration.Hop là.Voilà.Jusqu'ici, ça va pour tout le monde.Vous me dites.OK.
00:07:40 :On crée...Un super utilisateur, au moins.Hop.Gmail.comOuais, c'est ça.OK.Donc, voilà.Ça, ça me paraît pas mal.OK.Alors, comment ça fonctionne ?
00:08:07 :On va déjà se personnaliser un petit peu l'admin.C'est con, j'aurais dû prendre un snipet à copier.Ça aurait été beaucoup plus simple.Est-ce que j'ai pas un edit avec ça, justement ?
00:08:18 :Est-ce qu'on va pas perdre trop de temps là-dessus ?Hop.Euh...Qu'est-ce que j'ai ?Ouais, on va y aller là-dessus.Mince.Euh...Alors, juste, je coupe le temps.
00:08:35 :Ah.Sur Django, là.Sur Django.Je fais du Django pure pour l'instant.OK.Euh...Je coupe juste le temps d'aller sur mes guides,parce qu'il y a des choses, des clients que je peux pas montrer.
00:08:51 :Je les remets tout de suite.Euh...Hop là.Ah, Franck, c'est dommage pour sa connexion.Euh...Hop là.Je vais dans Admin.Et vous allez voir tout de suite ce que je vais faire.
00:09:07 :OK.Je vais tout copier.Voilà.OK, je relance le partage.Pour tout le monde, c'est bon ?Vous voyez là ou pas ?Oui.OK.
00:09:21 :OK, OK.Donc là, j'ai relancé...Hop là.L'Admin.Pour l'administration, en fait, quand vous avez un custom user,comme j'ai fait là,si vous voulez, du coup, avoir une administration sécurisée,j'avais fait un mentorat une fois au mois de novembre,il y a pas mal de choses à faire.
00:09:35 :Il faut notamment hériter de UserAdmin, ici,au niveau de l'admin.py.Donc, il y a pas mal de choses à faire.Il faut notamment hériter de UserAdmin, ici,au niveau de l'admin.py.
00:09:43 :Et donc, j'ai fait un peu de customisation.Zip code, il n'y a pas.Search field.Non, j'ai pas de zip code, en plus.OK.Donc, j'adapte à ce projet-là.
00:09:56 :E-mail, OK.Filmer, sign name, first name, last name, OK.Ça me paraît pas mal.J'ai rien à rajouter de plus, normalement.OK.Donc, je disais, pour un custom user, en fait,il faut qu'il soit propre au niveau de l'admin.
00:10:06 :Donc, utiliser UserAdmin,et puis,après, ça, c'est tout ce qui est formidable d'édition, en fait,pour afficher l'instance.Et ça, c'est quand vous créez l'instance de user, ici.
00:10:14 :Voilà.Je ne passe pas trop de temps dessus,parce qu'on va voir.Je ne sais pas si ça vous intéresse que ce soit.Donc, voilà.
00:10:21 :Donc, là, si je me connecte,et bien sûr, j'ai mis le profil, ici, aussi,pour faire un admin.Donc, je vais faire un run serveur.
00:10:30 :Et ça, c'est tout.Donc, j'ai fait un run serveur.Est-ce qu'il a envie de se lancer ?Vous voyez ?C'est bon, là, vous voyez ?
00:10:43 :Parfait.Donc, là, je vais aller dans l'admin.S'il le veut.Voilà.Donc, là, j'ai bien, ici, le profil,et puis, là, utilisateur.Et donc, vous voyez,j'ai un peu custom, ici,avoir les champs statut actifs, ici,qui apparaissent.
00:11:04 :Et là, j'ai bien sécurisé le trucen ayant le mot de passe qui est haché,en faisant un reset.Je peux faire un reset.Et si vous le faites à l'arrache,tout ça, c'est vraiment affiché en clair.
00:11:14 :Donc, il faut faire attention.Donc, voilà.Donc, j'ai bien mon utilisateur qui est là.Maintenant, ce que je vais vous montrer,c'est ici.Je vais couper le serveur pour l'instant.
00:11:25 :On va aller dans les modèles,du coup, on était.Donc, les signaux, en fait, les signaux.Donc, c'est valable pour le Django.Il y a Mathis qui demandait.
00:11:34 :C'est valable pour le Django ou DRF,peu importe.Là, c'est la même chose.Pour les deux, c'est valable.On ne fait pas de template, là.
00:11:41 :Si tu m'entends, Baptiste.Il n'y a pas d'autres messages dans la chatte.Ouais, OK.Super.Voilà.Et donc, je disais,les signaux commencent à marcher.
00:11:55 :Donc, on va commencer à importer,à faire un import pour les signaux.Ça va être par exemple.Alors, c'est dans.Je crois que c'est dans lesgo.db.models.
00:12:12 :Et on va importer.Alors, non, je crois qu'il y a .signals aussi.C'est ça.Import.Et je pense qu'on va se faire un post-save, déjà.
00:12:21 :Voilà.Donc, qu'est-ce qui va se passer, du coup ?Là, on a fait ce qu'on appelle.On a importé un post-save.Donc, en gros,je vais utiliser ici.
00:12:32 :Je pense que j'ai oublié un import.J'ai oublié un import.On va importer.Je vous explique ça.Dispatch, je crois.Import.Voilà.C'est ça.Alors, qu'est-ce qui se passe, du coup ?
00:12:48 :En gros,je vais expliquer une fois que je code.Ici,on a le récepteur.On a dit qu'on avait un post-save.Donc, c'est après la sauvegarde.
00:13:01 :Vous allez voir.Celui qui va envoyer,ça va être le custom user.Et là, on va faire une fonction.On va faire def create user profile.
00:13:17 :Voilà.Et là, ici,il faut qu'on rappelle notre sender.Ici,on a paramètres dans une instance.J'ai inventé rien.Ça, c'est du Django.C'est cadré.
00:13:26 :L'instance,on peut savoir s'il est créé.Première création.Et on peut mettre du coup...Et donc là,ce qu'on peut faire,maintenant,c'est qu'on veut que,quand on crée un utilisateur,le profil soit créé en même temps.
00:13:46 :Parce que là,par exemple,imaginez sur votre site,vous faites un sign up,une vue de sign up.Ça vous crée l'utilisateur,mais pas forcément le profil.
00:13:55 :Dans une administration,vous créez dans l'admin un utilisateur,mais pas forcément le profil de créé.Ce que vous pouvez faire,c'est que si c'est la première foisqu'il est créé,en gros,l'utilisateur,ce qu'on peut faire,c'est qu'on va,en même temps,créer un profil.
00:14:14 :Et donc,on va l'attribuer à l'instance,parce que l'instance,c'est l'utilisateur qu'on crée.Est-ce que ça va ou pas,pour l'instant ?Ou c'est compliqué ?
00:14:23 :Sinon,je reprends doucement.Ah non,c'est bien.Ok.Enfin,pour moi,après.Donc,on a lui,qui envoie,voilà,qui envoie.Dès qu'on fait un...
00:14:37 :Après la sauvegarde,en fait,du modèle custom user,qu'est-ce qu'il va faire ?Eh bien,il va les créer.Si c'est la première fois,d'ailleurs,que l'instance est créée,si c'est un update,ça ne marchera pas,du coup.
00:14:49 :Mais s'il est créé,ça va créer en même temps un profil.On peut tester.Je n'ai pas créé de template,en fait,ça se trouve dans l'admin.
00:14:55 :C'est aussi bien.Donc là,imaginez,par exemple,je vais ajouter ici,un utilisateur.Je ne sais pas,on va l'appeler...Il n'y a pas un email,par exemple.
00:15:05 :Là,je vais mettre le même,quand même.Hop là.Est-ce qu'il n'y a pasdes champs obligatoires ?Non,non,non,non,ça a l'air bon.
00:15:16 :Ok.Je crois que c'est bon.Donc là,on est d'accordque je crée un utilisateur.Voilà.Il a été créé.Et normalement,si je ne l'utilise pas,mon profil,voilà.
00:15:27 :Ici,j'ai bien un profilqui a été créépour Gabrielà base de string.fr.Et ça,en fait,c'est vraiment juste,c'est vraiment justeparce qu'en fait,ici,j'ai un signalqui fait que,du coup,dès que je crée un utilisateur,c'est la première foisqu'il est créé,et bien,
00:15:45 :ça va lui rattacherun profil tout de suite,créer une instance.Donc,c'est bon ?Oui, direct.Il n'y a rien d'autre à faire ?
00:15:52 :Non.Allo ?Oui.Allo ?Oui.Donc,c'est…Allo, Gab ?Oui,je t'entends.Donc,c'est justele découverteur,le reciveurqui fait le…qui exécutele processusde créationde l'utilisateur.
00:16:11 :Donc,c'est justele découverteurqui fait le…qui exécutele processusde créationde l'utilisateurqui exécute la fonction,en fait.Oui,c'est ça,oui.
00:16:24 :En fait,tu as ton…ce qu'on appellel'émetteur,en fait,qui, du coup,était dans mon décorateur,et bien,il va aller exécuterma fonction.
00:16:34 :Il y a des hookscomme ça.J'avais regardé,je crois,une fois le code source,c'est quand même balèze.C'est vraiment bien fait.Et il y a juste…Je n'ai rien fait de plus.
00:16:43 :J'ai juste créémes deux modèleset une fonction ici.C'est tout.Ce côté,je peux dire,c'est le background.Ça veut dire qu'il n'y a pas de…Il se lance automatiquementà chaque fois.
00:16:53 :Oui.Chaque fois,ou bien…Oui,dès que tu es un utilisateur,en fait,du modèle custom userqui est crééet dès que ça,il va être changé,et bien,en fait,ça va te créer un profilautomatiquementsi c'est la première foisque l'utilisateurest créé.
00:17:10 :D'accord.C'est automatique.Oui.Alors,attention parce queje ne suis pas fan du toutde créer pour un projet.Je vous montrerai aprèsrapidementqu'on y ressemble.
00:17:20 :Mais ça peut…En fait,c'est parce queje dois en avoir troisdans mon projetet c'est tout,pas plus.Après,il y en a…Parce qu'en fait,le problème,c'est que si vous en metteztrop,après,on va se dire,ah mince,c'est vrai,j'avais un signal.
00:17:38 :Du coup,c'est vrai,c'est pour çaque ça fait ça,ainsi de suite.Donc,moi,à la place de faire un signal,il est ouf.
00:17:47 :Bon,ça,de toute façon,il n'y a rien pour l'instantde fou dessus.À la place de faire un signal,moi,ce que je fais,par exemple,si je suis dans une vue,donc ça,c'est mes types de vuesque je fais.
00:18:00 :Pour en parler,c'est aussi,que ce soit du DRFou du lingo normal,j'ai un systèmeoù je décode des tokenspour activer les comptes.
00:18:07 :Je l'ai mis ouf.Le signal,par exemple.Moi,ce que je préfère faire,c'est quand la personnes'inscritdonc là,j'ai un formulaire d'inscription,j'ai une transaction atomique,on en a parlé l'autre fois,ce qui fait quequand l'utilisateur s'inscrit,je ne le sauvegarde pastout de suite en base,
00:18:22 :je fais un commit à false,je vais passer activeà false du coup,mais je vais lui créeren même tempsun profil,en fait,à son endroit là.
00:18:30 :Voilà.Je n'ai pas de signal,en fait.Après,je viens de réfléchirqu'en fait,ce n'est pas génialparce que du coup,si c'est une personnequi l'inscritdans l'administration,il n'aura pas de profilIl n'aura pas de profilde créé.
00:18:45 :Donc,ce qu'on pourrait imaginer faire,il y a une autre manièrede faire.Je vous montrepour avoir des alternativesaux signauxqui ne sont pas géniauxpour moi.
00:18:54 :On pourrait très bien dire,je ne sais pas,s'il y a un menu,par exemple,dans le modèle.Hop là,le custom user ici.On pourrait très bien direici,on surchargesave,self,c'est quoi?
00:19:07 :Je crois qu'il y ales...Ah,un user.Voilà.Et en fait,il y a un attributqui est très très bien.Vous pouvez dire,en fait,si...
00:19:19 :Ça,ça marche pour tous les modèles.Parfois,vous avez un attribut privé ici.C'est state adding,je crois.Non,je crois que c'eststate.adding.C'est ça.
00:19:29 :En fait,vous pouvez faire ça.Et puis là,ici,vous mettez la logique.Ça veut dire,en gros,si c'est la première foisqu'il est créé,vous créez un profil.
00:19:39 :Voilà.Vous l'oubliez pas,parce que ça peut êtretrès intéressant,même,par exemple,si vous voulez fairele projet de stock,le state addingpeut être intéressant.
00:19:49 :C'est,en gros,vous faites une actionquand c'est la première foisque vous créez icivotre instance.Voilà.C'est pour ça.Donc,voilà,je voulais dire qu'en gros,à la place d'utiliser un signal,moi,je ferais plutôt un truccomme ça,quoi.
00:20:05 :Et je vais recoder le trucet je vais faire comme ça,d'ailleurs,sur ce projet-là.Vous me dites,si j'ai trop vite.Je vois pas s'il y ades petits pouces.
00:20:18 :Oui,c'est bon,ok.Ok,je continue,alors.Du coup,les signaux,ils sont où ?Là.Alors,après,il faut savoir qu'il existeplusieurs types de signaux.
00:20:33 :Je les connais pas tous,mais j'en connais quelques-uns.Vous avez,par exemple,le post delete.Je vais rejouerl'attaque.Vous avez le post delete.Vous avez,alors,pré-save.
00:20:47 :Non,pré-save,vous voulez.Un pré-save,vous pouvez faire.Le post save,on l'a déjà faitet on pourra avoir un,il est pas ici,dans un autre module,on le fera après.
00:20:59 :Donc,par exemple,ce qu'on pourraittrès bien faire ici,juste pour vous montrerun peu ce qu'on peut faireavec le post delete,je vous montre un peuce qu'on peut faire avec.
00:21:09 :Donc,là,on peut faire un post delete.Voilà.Donc,là,c'est pareil,on va utiliser notresender.Sender,ça va êtrejuste un user.Et là,par exemple,on va pas s'embêter,on va faire un print.
00:21:25 :Peu importeque l'actionqu'on fasse,ça va s'exécuterdans tous les cas.On va mettredelete message,hop,et là,on va mettrele sender,etdéclarer.
00:21:39 :OK.Et donc là,par exemple,on peut très bien faireun print,c'est quand on supprime,ça, c'est ça,on dit supprimer.Après,on pourrait très bien dire,on va pas changer grand chose,on va faire un,je vais changer les printsou pas,un pre-save.
00:21:59 :Alors,on va faire un pre-save aussi.Juste qu'on ait bienl'exemple,hop,on va copier ça,on passe en VT.Un pre-save,donc là,on va mettre un post,un print.
00:22:13 :Là,j'ai dit qu'on faisaitun pre-save.C'est le custom user,on va imprinter quoi ?On va mettrevaêtre sauvegardé,je vais vous expliquerce qui se passeen arrière-planau niveaudes fonctionset de la base données.
00:22:32 :Et on pourrait très bien dire,on va finir avec ça,on a un pre-saveet on va remettreun post-savepour qu'on voitun peu la différence.
00:22:41 :Hop,hop,post,je pense que le post-save,j'ai rien oublié,on va mettrea été sauvegardé,est sauvegardé.Alors,voilà.Donc,si je reviens,du coup,je vois son serveur.
00:22:57 :Donc là,on a en plus,du coup,un delete.Donc,on vaafficher que c'est,alors,on peut très bien mettreune f-string.Hop,on va mettreinstance.
00:23:11 :Voilà,comme ça c'est plus clair.Et maintenant,du coup,si je supprime,par exemple,l'utilisateur qui est là,pas mon ami,tac,il est là.
00:23:23 :Comme ça,je remonte la console après,j'ai ça qui m'embête,tac.Si je supprime,on voit bien marqué ici,Gabriel Dufferingest supprimé.Et là,je vais vous montrer autre chose.
00:23:35 :En fait,c'est bon pour ça,il n'y a pas de problème.C'est le même principe.Oui,c'est la suppression.Alors,on a vu du coup le post-saveici comme ça,on a vu ça.
00:23:45 :Et en fait,il y a bien une différenceentre le pre-saveet le post-save.En fait,c'est quand vous appelez,quand vous faites un save,la méthode save,en fait,de votre instance.
00:23:55 :Vous avez déclenchétous les pre-savesqui sont enregistrés.Ensuite,il va y avoirune sauvegarde réellequi va se faireet après,il y aura tous les post-saves.
00:24:04 :Donc,par exemple,maintenant,si je retourne là,que je le sauvegarde,va être sauvegardéet sauvegardé.On voit bienqu'ils sont appelés après.Donc là,en gros,la méthode save,elle déclenche ça.
00:24:17 :Ensuite,entre deux,elle a sauvegardéla base de donnéeset après,elle va renvoyer ça.OK ?Yes.Alors,ensuite,il y en a un dernierque je voulais vous montrer.
00:24:29 :Et après,je vais vous montrerun exemple plus concret.Un vrai exempleque j'utilisesur une applicationde saturation.Vous avez...Alors,je ne sais plusdans quel module c'est.
00:24:40 :Je regarde sur Internetvite fait.C'est...Voilà,c'est .autfrom...C'est un peu à l'arabe.Django..contrib..signalsimportet c'estuser login.Alors,par exemple,vous voyez,vous pouvez avoirdes signaux.
00:24:57 :Alors,ça,c'est trop fort.Avoir des signauxquand un utilisateurse connecte,quand un utilisateurse déconnecteou quand il n'arrive pasà se faire un login.
00:25:07 :Quand le login,il faille.Donc,par exemple,on va reprendresur le même principe.Et je vais vous montrerun trucqui peut être intéressantaussi.
00:25:17 :Donc là,c'est pareil.On va à notre Receiverici.Tout simplement,ici,ça va êtreuser login.C'est dès qu'on aun utilisateur qui connecte.
00:25:27 :On va faireun peu tout bête.Et là,on va faire quoi ?Je crois qu'il fautle senderpour la requête.Useretle quark.
00:25:37 :Normalement,ça devrait marcher.Tout ça,c'est dans la doc.Je n'invente rien.Hop !Et maintenant,hop là !Print.Et là,on peut mettre,on va se faireune petite string.
00:25:50 :Donc,je vais mettreinstance.Non.Userplutôt.Userse connecte.Ok.Hop !Maintenant,si je vais ici,je me déconnecte.Je me reconnecte.Logiquement,si je ne suis pas gouré,voilà,Gabrielse connecte.
00:26:17 :Alors,il faut savoir quequand il y a un logind'un utilisateur,parce qu'ici,ça a remarqué ça.Donc,il y a deux autres signauxparce que quand un utilisateurse connecte,en fait,vous avez un champqui se met à jourque je vous montre.
00:26:32 :Je ne sais passi je l'ai remisdans mon admin.Si le champlast loginqui est là,en fait,il y a un save qui se fait.
00:26:40 :Oui,forcément.Donc,tout à l'heure,quand je fais,j'ai buggé,je fais,c'est quoi ce truc ?Après,je fais,à mon avis,c'est ça.
00:26:52 :Donc,effectivement,on peut,pareil,exécuter une action.Voilà.Est-ce que c'est bonpour vous,là,pour l'instant ?Oui,c'est excellent.C'est fort,hein ?
00:27:06 :Oui,c'est bien.C'est super.Excellent.C'est fort,mais il faut faire gaffe,quoi.Oui,oui,on ne peut pas foutrele bordel avec ça.Bon,alors,il y en a,je sais que la meilleure pratique,c'est de les mettredans un fichieren dessousdes modèlesqui sont concernés.
00:27:26 :Comme ça,je sais tout en ensemble.Je regarde les signauxque j'ai tout en bas,et tout en bas du modèle,j'y vais et je saisqu'ils sont là,quoi.
00:27:34 :D'accord.Mais c'est biend'avoir un fichier à part.Sauf que je croisque quand vous avezun fichier à part,il faut penser,en fait,à aller importerdes signauxdans Apps.
00:27:45 :Ici,je crois qu'il y aune méthodeà implémenteret vous importezvos signaux dedans,en fait.Mon projet perso.Ça, c'est mon projetde facturation perso.
00:27:57 :C'est le même casque tout à l'heure.De toute façon,je ne vais pas faireque je recommencemon environnement virtuel.Je vais le recréer,ce n'est pas grave.
00:28:10 :Du coup,en gros,ça c'est une application.C'est à la fois,ça fait partie de mon...Alors,la structure,elle a un peu spaceparce que c'est...
00:28:19 :Comment dire ?En fait,je gère mes vuestout dans les modèles,en fait.Toutes mes vuessont gérées dans les modèles.J'ai ce qu'on appelledes generic pages ici.
00:28:28 :Mais ça,c'est du Wagtail.C'est tout un apport du Wagtail.Donc,j'en étais où ?Custom user.Ici.J'utilise des signaux.Je vous expliqueun petit peule...
00:28:39 :Comment dire ?Ah !Le contexte.En gros,vous avez par exempledes clientsque vous allez mettredans votre base de données.Vous allez mettredes projetsqui sont rattachésà ces clients.
00:28:51 :Et pour chaque projet,vous allez exécuter des services.Vous allez créer un service.Par exemple,j'ai travaillé sur ce projet.J'ai travaillé telle date.J'ai passé une heuresur ce projet.
00:28:59 :Voilà.Et puis,on peut savoirsi c'est facturé ou non.Donc moi,par exemple,à la fin du mois,je passe tout en facturé.Tout ce que j'ai fait,tout ce que je facture.
00:29:09 :Quand je crée ma facture.Et vous avez le total ici.Voilà.Du serviceque j'ai fait,par exemple.Est-ce que ça vapour l'instant ?
00:29:17 :Oui.Oui, oui.Donc.Nickel.Donc,des clients,des projets pour les clients.Et à chaque fois,vous avez des servicesque vous faites au fur et à mesurepour ces projets.
00:29:28 :Mais à la fin,vous faites une facture.Et en fait,dans cette facture,elle est pour un client.Vous faites une facture.Et vous mettez,disons,tous les servicesque vous avez faitspour ce client.
00:29:39 :Ici.C'est un many-to-many.Donc,vous imaginezque je ne vais pasaller passer à SLUun par untous les services que je faisquand j'en fais pleinde petits servicespour qu'il y ait une même personne.
00:29:50 :Je ne vais pas aller passerà SLU un par unmes instances.Ce n'est pas possible.Ce serait trop compliqué.Du coup,ce que je fais,donc,ce que je fais,je vous le montre.
00:30:00 :Ici,j'ai des,donc,j'ai des signauxun peu plus complexes,on va dire.Donc,celui-là,voilà.Par exemple,celui-là,ici.Si j'ajoute,donc,une facture.
00:30:15 :Alors,là,le signal,c'est many-to-many change.Donc,là,c'est vraiment un signalpour les relationsmany-to-many.Ça,c'est bon pour vous,les many-to-many ou pas ?
00:30:27 :C'est à revoir pour moi.Oui,OK.Je vais revoir çaau fur et à mesureque je vais déroulerle parcours Django,ne t'inquiète pas.
00:30:35 :Oui,OK.Il n'y a pas de souci.OK,OK.En gros,du coup,là,dans les factures,invoice,je peux avoir plusieurs servicesici,rattachés à ma facture.
00:30:48 :Voilà.Je peux définirplein de services.Donc,par exemple,tout le mois,j'ai tous mes services du moiset je les rattache à ma facture.
00:30:56 :OK.Donc,ce qui se passe,c'est que,en gros,j'ai mon invoice,je vais sur mon champ,ici,services,l'attribut services,qui est là.Slug,donc ça,c'est pour aller chercher,en fait,la table qui fait le lienentre mon invoiceet ce que je fais ici.
00:31:14 :Donc,là,c'est un,pareil,c'est un signal.Si j'ajouteun service,eh bien,je vais tout,grâce à ce PK7,ici,qui est là,ici.
00:31:27 :Donc,c'est tous les servicesque je rattacheà ma facture,je les passe à Slugautomatiquement,dès que je save.Si je les enlèvede ma facture,je les passe à False.
00:31:37 :Comme ça,je n'ai pas à chaque fois,il y aura un momentoù je me suis trompé,je passe à Slug,False,celui-là,machin.Si, par exemple,je fais une suppression globaled'un coup,de tous les services rattachés,eh bien,ici,ça va me le passer à False aussi.
00:31:52 :Voilà.C'est bon ou pas pour l'instant ?Oui,d'accord.Voilà.C'est pour montrer un peula puissance des signaux,en fait.C'est que ce n'est pas quesur des instances,on ne fait pas que des chosessuper simples, quoi.
00:32:04 :C'est que là,par exemple,moi,je travaille carrémentsur du many-to-many avec.Ici,si il y a une factureque je supprime,tous les servicesqui sont rattachésà cette facture,je les récupèreet je les passetous à False.
00:32:18 :Parce que je supprimela facture,je vais la recommencer.Du coup,je les passe tous à False.Et en fait,pourquoi je ne fais pasun post-delete,donc vraimentaprès la suppression ?
00:32:28 :Parce que ici,si je fais un post-delete,le problème,c'est que je ne peux pluspasser par mon instancesi elle n'existe plus.Donc,avant qu'elle soit suppriméede la base donnée,je prends mon instanceet je récupèreles serviceset après,je les passe à False.
00:32:42 :Et après,c'est supprimé.Je supprime la facture.Est-ce que c'est bon ?Oui, oui.OK.Pas de souci.Je vaisrecevoir des messages.OK.Voilà,j'ai quoi ?
00:32:54 :Oui,par exemple,là,c'est pareil,j'ai un post-savepour un service.Dès que je...Ici,dès que je...Oui,OK.Voilà,c'est ça.Donc,je vais récupérerla facturequi est rattachée à ce service.
00:33:13 :C'est dès que je modifie un serviceque je vais modifier le nombre d'heuresque j'ai fait sur le service,par exemple.Je vais récupérerla facture de ce servicequi est là,l'invoice.
00:33:22 :Je le récupère comme ça.Et ma facture,dès que je l'ai,je fais un update totalcomme ça,en fait,le total de ma facturese met à jour tout seul.
00:33:31 :Je n'ai pas à faire manuellement,c'est pareil.Donc là,voilà,j'ai vraiment trois exemples concretsde signaux un peu plus élaborésque ce qu'on a vu tout à l'heure.
00:33:38 :Voilà.C'est ce que je voulais vous montrerprincipalement ce soir.Est-ce que ça a été pour vous ce soir ?Est-ce qu'il y en aqui ont déjà utilisé un petit peu ou pas ?
00:33:48 :Ou pas du tout ?Non,moi,je n'ai jamais utilisé.Jamais ?Non,jamais.Moi non plus.Non,non,jamais.OK.Est-ce que j'ai facturé trop vite ?
00:34:04 :Est-ce que ça a vraiment étépour ces derniers-là ?Est-ce que vous avez comprisle principe ou pas ?Perso,j'ai compris le principe,mais je pense que je dois revoirpour la pratique.
00:34:18 :Ah bah oui,oui,c'est clair,c'est sûr.Moi,au début,les signaux,j'en ai pratiqué quelques-unsavant de bien les mettre en têteparce que j'avais du mal un peuavec la logique des signaux.
00:34:30 :Je trouvais ça bizarre au débutde déclencher des événementscomme ça alors quetu crois que ça ne rattache à rien,mais en fait,si,c'est vrai.
00:34:38 :Est-ce qu'il y en a qui comptentles utiliser maintenant,du coup ?Ouais,c'est intéressant.Oui,maintenant que,c'est toujours pareil,quand il y a un outilqu'on ne sait pas qu'il existe,ben,on ne l'utilise pas,quoi.
00:34:56 :Et effectivement,là,c'est fait une ouverture.Ouais,c'est cool.Non,mais c'est bien,c'est bien.Il y a une docplutôt complète là-dessus.Des fois,j'ai du mal avec les docs.
00:35:11 :Sur celle des signaux,bon,j'ai vu lesquels existaient,mais là,je ne sais pas si vous voyez,il y a un avertissement ici.Voilà.Ici,ils disent,partout où c'est possible,vous devrez choisirles appels directs au code à exécuterplutôt que par la distribution de signaux.
00:35:26 :En gros,ils disent éviter un maximumles signaux dès que c'est possiblede faire entrement,quoi.Ouais,OK.Parce que c'est difficileà débugger,quoi.
00:35:37 :Quand il y en a trop,bien sûr.Mais,voilà.Hop là.Ouais,il faut se mettre surde l'angle d'arrêt,là,Baptiste.Je suis d'accord avec toi.
00:35:51 :OK.Je suis désolé,je...Ah,mine de rien,ça fait déjà un momentqu'on est...OK.Je pensais que j'avais faitun petit peu trop.
00:36:03 :Écoutez,est-ce que vous avez des questionsou pas ?Non,ici,ça va.Ça va ?Moi,je n'ai pas de questions,en tout cas,mais si j'ai reçula décision,c'est vraimentque je vais poser autantde questions.
00:36:21 :Ouais.Non,il n'y a pas de problème,ne t'inquiète pas.Sur le Discord,il n'y a pas de souci.Il n'y a pas de souci.
00:36:29 :Oui ?Est-ce quec'est toujours relatifà l'évolutionde la base de données,enfin des événementsde base de donnéesou est-ce queon peut généreravec du Python purpar un événement extérieurdu style,moi,je travaille dans l'industrie,donc si on écouteque je fais du monitoring
00:36:48 :ou des choses comme ça,est-ce qu'on peutrécupérer ce genrede signauxou pas du toutdepuis l'extérieur ?Il me semble que oui.D'accord.
00:37:00 :J'ai regardé la doc.J'ai regardé la doc.Déjà,de savoir quesi c'est ouvert,c'est intéressant.Ouais,non,mais normalementtu peux faire ça.C'est comme situ avais un bus de donnéesen fait.
00:37:14 :Oui,c'est l'idée,oui.En fait,tu peux passer par l'instanceSignal,je crois,alors je ne sais plusoù elle est.Je pense qu'elle estdans,on voit sur mon écran,je ne sais plus.
00:37:27 :Oui.Non,on ne voit paston partaged'écran.Oui,voilà,ça va aller.Alors,je n'ai plus touché à celui-làdu coup,parce que ça,c'est mon truc perso,chose gaffe.
00:37:41 :Ventora,c'est où ?Non.C'est ici que j'avais.Alors,je crois que c'estdepuis Dispatch.Il me semble que tu peuxavoir la classe Signal.
00:37:54 :Voilà.Et je crois,alors,tu as peut-êtredes signaux tout près,mais tu peux,en fait,faire des signaux personnaliséset normalement,du coup,tu peux utiliserdes services externes.
00:38:06 :Pour moi,il n'y a pas de raison.Je n'ai jamais eu le cas.Mais,en fait,tu peux te faire des signauxpersonnaliséspar cette classe.
00:38:14 :D'accord.J'en suis quasimentsûr que j'ai vu,si j'ai vu dansla doc,ce truc-là.Mais,tu peux,par exemple,t'abonner avecla classe Signal,admettons,du MQTTou ce genre de choses.
00:38:28 :J'ai un doute.Je n'ai pas poussé à fondles signaux.Je n'ai jamais eu,je n'ai jamais pousséle concept.Alors,bonne question.Là,il ne faudra pas te répondre.
00:38:43 :Je suis désolé.Qu'est-ce que,du coup,ça devient un événementextérieur au fonctionnementdu style Save,etc.,enfin,relatif à Django.Mais,je pense que...
00:38:54 :C'est un événementqu'on pourrait direextérieur,quoi.Je pense que tu peux avoirun...Moi,je pense que tu pourraisutiliser un événementen fonction d'uneclasse personnalisée.
00:39:07 :Pour moi,c'est jouable.Pour moi,c'est possible à faire,ça.C'est quel type de technoque tu utilises,je disais,si c'est pas indiscret,du coup ?
00:39:17 :C'est de la scrutationde réseau.Donc,soit c'est du OBCD,pardon,du ODBCou soitc'est directementdu Siemens.D'accord.C'est par des trappes...Enfin,quand tu disscrutation réseau,c'est des trappesSNMP ?
00:39:33 :Euh...Non,non,c'est...En fait,c'est comme une...C'est un programmequi tourne en arrière-plan.D'accord.Qui va liredes adressesdans un automate programmable.
00:39:45 :Le but,c'est de les récupérer,en fait.Et donc,on pourrait très bienimaginersur un flag machinedire,on fait telle choseou,enfin,on fait différentes choses.
00:39:57 :L'idée,c'est de pouvoircomprendrequelle passerelleon peut fairedirectementavec Django,en fait.Je regardais.Apparemment,toi aussi,avec du MQTT,tu pourrais très biente faire aussi.
00:40:11 :Que ça soit du MQTTou autre chose,c'est des datasqui circulent,quoi.Bon,à partir du momentoù tu faisune classe personnaliséeet que tu choisisce que tu veux écouter,je pensequ'il n'y a aucun souci.
00:40:24 :D'accord.Il n'y a aucun souci.C'est super intéressant.OK.La prochaine fois,du coup,on ira un peu plus.Alors,je ne sais pas,est-ce que ça vous intéresseun peula customisationde l'adminou pas du tout ?
00:40:38 :Parce que je pense savoir.Sinon,je partirais sur autre chose.Je pourrais faire çaun peuet partir sur autre choseaprès.C'est comme vous voulez.
00:40:46 :Dans quel sens ?Dans le faitd'ajouterdes champsspécifiqueset utiliserces propriétésdans l'admin,utiliserun cas d'affichageen faitpour mettre en placeun moteur de recherchepar exemple,créer des commandescustom dans l'adminet,je ne sais pas,par exemple,imaginervous avezun modèle
00:41:09 :catégorieet à côté de ça,vous avez un modèlesous catégorie.Sauf qu'à chaque fois,vous allez avoirdes sous catégoriesrattachées aux catégories.On est d'accord ?
00:41:18 :Par exemple.Le problème,c'est que dans l'admin de Django,de base,quand vous utilisez la catégorie,vous n'avez que la catégorie.Vous allez la créeret après,il faut repartir sursous catégorieet ensuite,elle écrit les sous catégoriesà part comme ça,une par une.
00:41:33 :Mais,je pourrais vous montrerun moyende tout mettre ensembleles catégorieset les sous catégoriesjuste en dessouset comme ça,en fait,c'est super simpleà créer,à bosser,c'est plus pratique.
00:41:46 :Si vous voulezje pourrais vous montrer ça.Oui.Ça vous permetde gérer l'adminsuper propreet super efficacement.Oui,carrément.Avec des façonsde filtrer,des façonsde commande custom,des façons de filtrage,des moyensmême de remplir.
00:42:05 :En fait,j'ai fait un trucil n'y a pas longtempsoù j'ai un champdans l'adminqui est écoutépar un autre champet quand j'écris,je fais du JavaScriptmais du JavaScriptque j'ai fait en Pythonentre guillemetset quand j'écrismon champ,ça me crée mon slug
00:42:20 :au fur et à mesuretout seul.Ça c'est un peu gadgetmais voilà,ça fait jusqu'à làla personnalisation.Donc,on pourra faireun truc vraimentcomplet si vous voulez.
00:42:30 :Donc,tu as un lienqui se faitdirect en JS.Tu as des passerellesJS comme ça ?Oui,ça m'intéresse.Ok.J'ai pas mal galéréen JSdepuis une certaine époquelà.
00:42:43 :Oui.Donc,après,je suis partià fairedu JS purdans le DOM,etc.Enfin,bref.Donc,il y a certainementdes outilsqui existent.
00:42:57 :Ouais,ouais.Bah,écoute,écoutez,on fera çala prochaine fois.Le JS,c'est moins de contourner.Là,avec Django,du coup,je le fais en Python.
00:43:10 :Ce que je fais,mais après,c'est rien.C'est juste une fonctionnalitéque je fais en Pythonpour voir pourquoi c'est pratique.Parce qu'il y a un casoù il faut être bloqué,en fait,et devoir tout faire un par unet que là,en fait,ça vous débloque le truc
00:43:23 :à l'aise.Puis,une fois,on pourra faire un peude HTMX aussi,mais je sais plussi je vais faire un mentorat dessus.Je suis pas un pro,mais ça permet de contournerun peu le JavaScript aussi.
00:43:33 :Oui,oui,tout à fait.Ok.Bah,écoutez,je prévois la customisationde l'admin pour le prochain mentorat,jeudi prochain,du coup.D'accord.Je sais pas combien,parce qu'il y en a unoù c'est pas le mercredique je le fais.
00:43:48 :C'est pas le 24.Ah,bah,c'est bon.Ok.Bon,ce sera jeudi 24.C'est celui d'aprèsoù je ferai le mercrediou le jeudi,alors.
00:43:59 :Ok.Ouais,parce que le jeudiaprès,c'est le premier.Ouais,mais je suis pas là.C'est le startdu projet.Oui,alors je serai là,je serai là,j'aurai mon PC avec moiet tout.
00:44:13 :Donc,pour le projet,s'il y a des besoins,je suis là,quoi.D'accord.De toute façon,le projet,je vais pas le démarrertout de suite,tout de suite.
00:44:24 :Enfin,pour la petite histoire,moi,je vais me faire opérerla veille.Je me fais opérer le 30.Ah,merde.D'un oeil,donc,je vais pas forcémentfaire du clavieret de l'écrantout de suite,tout de suite,tu vois.
Aucune occurrence trouvée pour « ».