La classe AbstractBaseUser
Exclusif Premium
Débloquez votre potentiel ! ✨
Cette session fait partie de notre programme Premium exclusif
+100h de formations exclusives
+180 exercices de code avancés
+100h de mentorats en réécriture
20 projets guidés pas à pas
Mentorats groupés hebdomadaires
Support individuel avec nos mentors
Prêt à passer au niveau supérieur ?
Découvrez tous les avantages Premium et transformez votre apprentissage dès aujourd'hui!
Inscris-toi
(c'est gratuit !)
Un compte est nécessaire pour participer aux discussions.
Créer un compteToutes les questions

De716
22 février 2024
Résolue
4 réponses
user et superuser dans le même modèle
Bonjour, je souhaite dans mon application définir des utilisateurs avec email comme identifiant de connexion et des champs obligatoires nom, prenom et adresse.
Dasn le même temps je ne souhaite utiliser qu'un email, nom et prenom (pas d'adresse) pour le superuser. J'ai donc différencié les fonctions `create_user` et `create_superuser`.
Est-ce la bonne façon de procéder? fFaut-il lier un profil pour différencier `user` et `superuser`?
D'autre part la doc Django indique qu'un champ qui a `blank=False` doit apparaitre dans `REQUIRED_FIELDS`, or je ne veux pas que ces champs me soient demandés avec la commande `manage.py createsuperuser`.
J'ai donc essayé sans inclure le champ `adresse` et cela semble fonctionner quand même.
Voici les modèles CustomManager et CustomUser que j'ai créé, avec les champs obligatoire qui ont `blank=False`:
```
class CustomManager(BaseUserManager): # on crée un manager qui va gérer notre modèle Visiteur customisé
def create_user(self, email='', nom='', prenom='', adresse='', password=None):
if not email:
raise ValueError("Vous devez entrer un email.")
# On utilise l'attribut 'model' du manager. Cet attribut fait référence au modèle géré par le manager (CustomUser)
user = self.model(
email=self.normalize_email(email),
nom=nom,
prenom=prenom,
adresse=adresse,
)
user.set_password(password)
user.save()
return user
def create_superuser(self, email, nom='', prenom='', password=None):
if not email:
raise ValueError("Vous devez entrer un email.")
# On utilise l'attribut 'model' du manager. Cet attribut fait référence au modèle géré par le manager (CustomUser)
user = self.model(
email=self.normalize_email(email),
nom=nom,
prenom=prenom
)
user.set_password(password)
# user = self.create_user(email=email, nom=nom, prenom=prenom, password=password)
user.is_admin = True
user.is_staff = True
user.save()
return user
class CustomUser(AbstractBaseUser):
nom = models.CharField(max_length=150, blank=False)
prenom = models.CharField(max_length=150, blank=False)
adresse = models.CharField(max_length=150, blank=False)
email = models.EmailField(max_length=150, unique=True, blank=False)
is_active = models.BooleanField(default=True)
is_staff = models.BooleanField(default=False)
is_admin = models.BooleanField(default=False)
USERNAME_FIELD = "email" # on indique le champ qui servira d'id de connexion
REQUIRED_FIELDS = ["nom", "prenom"] # on n'inclut pas le champ qui sert de 'username'
objects = CustomManager()
def has_perm(self, perm, obj=None):
return True
def has_module_perms(self, app_label):
return True
```
Merci pour votre aide.
Ali
00:00:00 :Dans cette vidéo, on va créer un modèle d'utilisateur qui va être entièrement personnalisé.Donc c'est une bonne façon de procéder si vous souhaitez vraiment personnaliser la façon dont les utilisateurs de votre site vont s'authentifier,par exemple sur votre site, en utilisant par exemple un email à la place d'un nom d'utilisateur.
00:00:28 :Donc à l'intérieur de mon fichier models.py, je vais importer déjà la classe AbstractBaseUser dont on va hériter.Donc je vais faire from Django.contrib.auth.baseUser import AbstractBaseUser.
00:00:43 :On va ensuite créer une classe CustomUser qui va hériter de cette classe AbstractBaseUser.Et on va, à l'intérieur de cette classe, créer nos propres champs qui vont nous permettre de définir notre utilisateur.
00:01:04 :On voit qu'actuellement on a juste deux champs qui sont définis, qui sont le mot de passe et la slugging.Donc on n'a rien d'autre qui est défini et il va falloir qu'on définisse un champ qui sera utilisé comme nom d'utilisateur.
00:01:16 :Dans ce cas-ci, nous ce qu'on va utiliser ce n'est pas un nom d'utilisateur mais une adresse email.Donc je vais créer un champ ici que je vais appeler Email qui va être un champ de type EmailField.
00:01:26 :Déjà il faut que j'importe les modèles, donc je vais faire FromDjango.db ImportModels.Et à l'intérieur des modèles, on va aller chercher le champ EmailField, donc Models.EmailField.
00:01:36 :Et on va spécifier quelques paramètres ici. On va déjà spécifier qu'il doit être unique.Donc ça c'est absolument obligatoire si vous souhaitez utiliser ce champ pour le nom d'utilisateur car on ne souhaite pas avoir logiquement deux utilisateurs qui ont le même nom d'utilisateur.
00:01:50 :Donc dans ce cas-ci le même email.Puisque pour un processus d'authentification, quand on se connecte sur un site, forcément on ne peut pas avoir deux utilisateurs qui ont le même identifiant.
00:02:00 :Donc si vous souhaitez utiliser l'email, il faut bien mettre unique égale true ici.On va ensuite spécifier une longueur maximale qui va être de 255 et on va dire qu'il ne peut pas être vide.
00:02:10 :Donc on va dire blank égale false.Donc c'est tout ce qu'on définit ici et on va ensuite spécifier qu'on veut utiliser ce champ pour le nom d'utilisateur.
00:02:18 :Donc le champ qu'on va utiliser pour se connecter à notre site.Donc on va faire un attribut qui s'appelle username field et qui va être égal à la chaîne de caractère email tout simplement.
00:02:26 :Donc ça c'est le nom de notre champ ici que l'on va utiliser.On n'a pas de required field ici, on ne va pas en mettre.
00:02:33 :Mais si jamais vous aviez des champs que vous souhaiteriez rendre obligatoires, vous devriez mettre un required field ici.Donc par exemple si on souhaitait rendre obligatoire que l'utilisateur rentre un h, par exemple on pourrait faire un champ h ici.
00:02:46 :Donc là il faudrait mettre une liste si je ne me trompe pas.Donc une liste puisqu'on pourrait avoir plusieurs champs ici qui sont requis pour l'utilisateur.
00:02:52 :Donc là il faudrait créer bien entendu un champ associé par exemple avec un integer field ici dans notre modèle.Donc nous on ne va pas faire ça mais je vous le montre quand même puisque ça peut être intéressant d'utiliser d'autres champs ici qui soient requis.
00:03:04 :A la suite de l'email on va également créer quelques champs qui sont nécessaires pour que l'interface d'administration de Django fonctionne.Donc ces champs ils sont à l'intérieur de la documentation dans utilisateur personnalisé et Django contrib admin.
00:03:18 :Donc vous pouvez chercher pour cette phrase ici à l'intérieur de la documentation de Django.Et vous voyez ici qu'il nous indique en fait que ces quatre champs ici sont nécessaires.
00:03:27 :Donc on a isStaff, isActive et là en fait on a deux méthodes hasPerm et hasModulePerm que l'on va devoir créer.Donc on va faire déjà le champ isActive et isStaff.
00:03:37 :Donc isActive ça va tout simplement permettre de définir si un utilisateur est actif ou non.Donc ça va être un champ de type boolean et par défaut on va le mettre à true puisque quand on crée un nouvel utilisateur on souhaite indiquer que l'utilisateur est actif par défaut.
00:03:50 :Et par la suite on pourrait bien entendu choisir de le désactiver donc de passer ce boolean à false.Là il y a juste ici une petite erreur alors une erreur d'indentation voilà que j'ai réglé.
00:04:09 :Donc isStaff ça va nous permettre de spécifier si un utilisateur a accès ou non à l'interface d'administration de notre site.On a ensuite un autre champ qu'on va créer qui est isAdmin cette fois-ci et isAdmin ça va là encore être un boolean.
00:04:56 :Donc là je peux remettre un charField avec blank qui est égal à true puisqu'on peut vouloir ne pas spécifier forcément ce zip code.Donc on pourrait en fait vouloir qu'un utilisateur n'ait pas à rentrer son code postal donc je mets blank égal à true et on va mettre une longueur maximale ici de 5
00:05:11 :puisque le code postal en France ne peut pas faire plus que 5 caractères.Donc là on a tout ce qu'il faut normalement il ne reste plus que les deux méthodes que je vous ai montré à l'intérieur de la documentation.
00:05:21 :Donc la méthode hasPerm et hasModulePerm qu'on va mettre ici.Donc ces méthodes vous pouvez les retrouver à l'intérieur de la documentation ici avec les différents paramètres qui sont acceptés.
00:06:38 :Donc maintenant que j'ai fait tout ça je vais pouvoir appliquer les migrations dans ma base de données pour enregistrer ce modèle d'utilisateur.Donc je vais ouvrir un terminal ici et à l'intérieur du dossier source donc dans lequel je me trouve actuellement je vais pouvoir utiliser python manage.py et make migrations pour créer les migrations à l'intérieur de mon application accounts.
00:07:10 :Puisque abstract user il y avait plusieurs champs par défaut comme le first name, le last name, le username et d'autres champs comme ceci.Là dans ce cas ci on a juste donc le primary key, le id qui va nous permettre de spécifier dans notre base de données les différentes entrées.
00:07:54 :Je vais pouvoir ensuite donc créer tout ça à l'intérieur de ma base de données donc avec la commande migrate.Donc toutes les migrations ont été appliquées et je vais pouvoir regarder ce que ça donne à l'intérieur de table plus.
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.