- Formations
- conversion_path Parcours & Formations
- science Projets
- data_object Exercices de code
- psychology Exercices IA
- quiz Quiz
- Articles
- rss_feed Blog
- sort_by_alpha Glossaire
- menu_book Guides
- help_center FAQ
- media_link Ressources
- Communauté
- groups La communauté
- forum Questions
- live_tv Mentorats
- science Projets mensuels
- Formations
- conversion_path Parcours & Formations
- science Projets
- data_object Exercices de code
- psychology Exercices IA
- quiz Quiz
- Articles
- rss_feed Blog
- sort_by_alpha Glossaire
- menu_book Guides
- help_center FAQ
- media_link Ressources
- Communauté
- groups La communauté
- forum Questions
- live_tv Mentorats
- science Projets mensuels
Deviens membre Premium magic_button
Débloque cette session en devenant Membre Premium 🚀
Inscris-toi
(c'est gratuit !)
Un compte est nécessaire pour participer aux discussions.
Créer un compte person00:00:00 :Actuellement, avec notre classe CustomUser qui hérite de AbstractBaseUser,quand on essaye de créer un super utilisateur ou un utilisateur tout court,on a cette erreur ici.
00:00:11 :Si vous vous souvenez bien, dans une partie précédente,quand on est allé explorer un peu ce qu'on avait au niveau de Djangodans le fichier models.py, à l'intérieur de DjangoContribHot,
00:00:21 :on avait ces fonctions createUser et createSuperUser.Et on a donc cette fonction au final,donc cette fonction ici avec le tiré du bas devant,qui est la fonction qui nous permet de créer un utilisateur.
00:00:32 :À l'intérieur de cette fonction, on a plusieurs choses qui se passaient,donc par exemple ici, on normalise l'email,on normalise le nom de l'utilisateur,et par la suite, on change le password, donc le mot de passe,et on sauvegarde l'utilisateur dans notre base de données.
00:00:44 :Donc forcément, maintenant qu'on a créé un modèle custom,avec un email, avec un zip code,et avec des comportements personnalisés,Django ne peut pas deviner comment on doit créer l'utilisateur.
00:00:55 :Puisque là, par exemple, on a mis email,on a deviné qu'on a mis n'importe quoi ici,Django ne peut pas deviner qu'il doit, par exemple,changer le isActive, qu'il doit utiliser ce champ, etc.
00:01:05 :Donc pour ça, on va devoir créer notre propre manager,donc on va devoir créer quelque chose qui est similaire à ce qu'on a ici,avec une fonction createUser et une fonction createSuperUser.
00:01:14 :Vous voyez que la différence entre les deux,c'est juste qu'on a quelques modificationsqui sont effectuées à l'intérieur de createSuperUser,mais au final, les deux, ici, appellent createUser.
00:01:24 :Dans createSuperUser, la seule chose qui change,c'est qu'on change ici le isStaff, qu'on le met à true,et on change le isSuperUser également pour le mettre à true.
00:01:32 :Donc c'est vraiment les deux seules choses qui changent,et après, on passe toutes les données à createUserpour créer notre utilisateur.Donc nous, ici, à l'intérieur de AccountsModel,donc dans mon fichier de modèles ici dans mon application Accounts,je vais créer un manager customque l'on va pouvoir lier à notre classe ici.
00:01:49 :Donc je vais créer une classeque je vais appeler MyUserManager, tout simplement,et cette classe, elle va hériter de BaseUserManager.Donc pour l'instant, je vais juste mettre un pass à l'intérieur.
00:02:00 :On va importer ça ici, donc je mets mon curseur dessus,je clique sur l'ampoule de PyCharm,et je clique sur l'import ici,donc c'est à l'intérieur de DjangoContribHotBaseUser.
00:02:10 :Donc là, ici, en fait, on avait déjà l'importqui était fait pour abstractBaseUser,et on a le BaseUserManager qui se trouve dans le même module ici.
00:02:17 :On va pouvoir ensuite relier cette classe ici à notre modèleen spécifiant que pour l'attribut Objects,on souhaite utiliser maintenant MyUserManager,donc une instance de notre classe qu'on a créée ici.
00:02:29 :Donc ici, on va créer une première méthodequi est CreateUser,et on va passer l'email et le mot de passe.On va pouvoir passer également d'autres champs,donc par exemple, si on voulait permettre,quand on utilise cette fonction, de passer le zip code,eh bien, on pourrait soit mettre directement, explicitement,
00:02:47 :zip code ici, et vu que ce n'est pas un champ obligatoire,on pourrait le passer à None, avec une valeur par défaut ici à None.
00:02:53 :Ou alors, on peut mettre directement, par exemple,deux astérisques pour récupérer tous les paramètres possiblesqui seraient envoyés à cette fonction.Dans ce cas-ci, je ne vais pas compliquer le code,je vais juste faire une fonction qui prend un email et un mot de passeet crée un utilisateur avec ces deux informations uniquement.
00:03:09 :Puisque tout le reste, en fait, on va le définir automatiquement.Le isActive, isStaff et isAdmin,on va le modifier quand on va créer notre méthode pour le super utilisateur,et sinon, on va utiliser les valeurs par défaut qui sont définies ici.
00:03:20 :Donc dans CreateUser, ce qu'on va faire,c'est déjà vérifier si on a un email ou non.Si on n'a pas d'email, donc on va faire IfNotEmail,on va lever une erreur, puisque l'email ici,dans notre classe CustomUser,c'est le champ qui est utilisé pour le nom d'utilisateur.
00:03:34 :Donc on est obligé d'avoir un nom d'utilisateur pour créer un utilisateur.Donc si on n'a pas d'email, on va tout simplement lever une valueErroret dire, vous devez entrer un email.
00:03:45 :Tout simplement.Ensuite, si on a un email, on va continueret on va créer un modèle d'utilisateur.Donc on va dire user égale self.modelet on va passer les informations pour créer notre utilisateur.
00:03:57 :Donc dans ce cas-ci, on a juste besoin de passer l'emailet on va normaliser cet email avec la fonction NormalizeEmail.Donc on va faire self.normalizeEmail
00:04:05 :et on va passer l'adresse email qui est envoyée à cette fonction ici.Si vous voulez voir à quoi ressemble NormalizeEmail,c'est tout à fait possible.
00:04:12 :Un petit clic droit.Go to declaration or usage.Et là, vous voyez que tout simplement,cette méthode est définie à l'intérieur de BaseUserManager ici.Donc c'est la classe dont on hérite pour faire notre classe custom ici.
00:04:26 :Donc on a bien entendu accès à cette méthode icipuisqu'on hérite de cette classe.Et dans BaseUserManager, donc dans NormalizeEmail,tout ce qu'on fait, c'est vérifier si on a bien un nom pour l'email,un arrow base et un nom de domaine tout simplement.
00:04:39 :Donc c'est juste une méthode qui permet de vérifier qu'on a un email valide.Ensuite, on va modifier donc le mot de passe.Donc comme je vous l'avais dit dans une partie précédente,on ne peut pas modifier le mot de passe en faisant tout simplementuser.password écale password,
00:04:51 :puisqu'il va falloir passer par le processus qui va nous permettred'obfusquer le mot de passe et de ne pas le stocker en clair dans la base de données.
00:04:58 :Donc pour ça, on va utiliser à la place setPassword,donc la méthode setPassword,et on va lui passer le mot de passe que l'on passe à createUser ici.
00:05:06 :Donc notre mot de passe ici,on le passe à setPassword,et ensuite on va tout simplement sauvegarder le modèle dans la base de donnéeset le retourner.
00:05:14 :Donc user.save et on retourne l'utilisateur.Donc voilà, c'est vraiment très simple.On pourrait faire plein d'autres choses ici.On pourrait vraiment faire toutes les choses qu'on a envie de faireà chaque fois qu'on crée un utilisateur,et ça serait effectué à chaque fois qu'on utilise createUser.
00:05:28 :On va faire la même chose cette fois-ci avec createSuperUser.Donc ici, je vais faire une autre méthode qui s'appelle createSuperUser.On va passer là encore l'email, le mot de passe,et on va utiliser notre createUser,sauf qu'on va faire quelques modifications avant ça.
00:05:44 :Donc on va utiliser notre méthode createUser.On va passer à l'email, notre email, et au mot de passe, notre mot de passe.Donc ça, c'est tout simplement pour éviter d'avoir à répéter tout ce code ici.
00:05:54 :On va tout simplement appeler cette méthode qu'on a définie ici,qui va nous permettre de vérifier qu'on a bien l'adresse email,qui va nous permettre de normaliser l'email, de setter le password, etc.
00:06:03 :On va récupérer ça dans une variable que je vais appeler user,et la seule chose qu'on va faire, c'est modifier légèrement cet utilisateur.Puisque dans le cadre d'un super utilisateur,on veut qu'il ait les droits d'administration et qu'il fasse partie de l'équipe.
00:06:16 :Donc on va modifier tout simplement le isStaff et le isAdmin,qui par défaut sont à false.Donc ce que je fais ici, c'est user.isAdmin égale true,
00:06:25 :et user.isStaff égale à true.Et je sauvegarde les changements, donc user.save,et on retourne l'utilisateur.Donc voilà, c'est tout ce qu'on fait.On utilise tout ce qu'on avait fait dans createUser,on change ces deux attributs ici,on sauvegarde l'utilisateur et on le retourne.
00:06:41 :Et voilà, c'est tout ce qu'on a besoin de faire,normalement ça devrait fonctionner.On a notre manager custom,qui nous permet de créer un utilisateur et un super utilisateur,et c'est ce manager que l'on utilise,puisqu'on l'a spécifié ici avec l'attribut object.
00:06:54 :Donc je vais rouvrir un terminal,et on va maintenant essayer de recréer ce super utilisateur.Donc je vais faire python manage.py create super user.Je valide avec entrée.
00:07:05 :Je vais rentrer donc une adresse email.Là, vous voyez que cette fois-ci, on n'a plus d'erreur,donc on n'a plus cette erreur attribute manager,manager object has no attribute.
00:07:14 :On va pouvoir rentrer donc un mot de passe,puisque là c'est vraiment les deux seules choses qui sont requises,l'adresse email et le mot de passe.
00:07:19 :Donc je vais mettre 1, 2, 3, 4, 5, 6.1, 2, 3, 4, 5, 6.Là bien sûr, il va me dire que le mot de passe n'est pas valide,puisqu'il est trop court, il est trop commun,et il ne contient que des chiffres.
00:07:29 :Ce n'est pas grave.Je valide avec Y, donc yes.Je valide avec entrée, et voilà.Mon utilisateur a été créé.On va aller vérifier en lançant un shellqu'on a bien notre utilisateur dans la base de données.
00:07:41 :Donc je vais importer depuis accounts.model ma class custom user.On va récupérer le premier utilisateur, donc objects.first,puisque dans ce cas-ci, là encore, il n'y a qu'un seul utilisateur,donc je suis assuré de retomber sur l'utilisateur que j'ai créé.
00:07:54 :On va vérifier si cet utilisateur est bien staff.C'est le cas.Est-ce qu'il est admin ?C'est le cas.Est-ce qu'il est actif ?C'est le cas également.
00:08:02 :Est-ce qu'il a un zip code ?Non, puisque là, on n'en a pas spécifié.Donc là, on a une chaîne de caractère vide, et c'est normal.
00:08:08 :Et donc si on souhaitait afficher un zip codeet permettre à l'utilisateur de le créer ou le mettre requis,il suffirait de modifier notre classe ici.
00:08:16 :Par exemple, en rajoutant required fields ici,et en précisant directement dans les fonctions ici.Par exemple, en rajoutant un paramètre zip codequi nous permettrait, lors de la création d'un utilisateur,directement de rentrer cette information.
00:08:29 :Donc après, là, ça reste du piton.C'est du piton de l'orienté objet.On a vraiment ici la base de la personnalisation d'un utilisateurà partir de cette classe, donc BaseUserManager,pour modifier la fonction CreateUser et la fonction CreateSuperUser,et notre classe ici qui hérite de AbstractBaseUseret qui nous permet d'avoir vraiment quelque chose
Ce n'est pas fini...
✋
Tu as complété % du parcours 🔥
Termine l'intégralité de la formation pour pouvoir débloquer ton attestation de réussite.