Django - classe User
Bonsoir.
Une petite question...
Je tente d'appréhender la gestion des utilisateurs avec Django. Ok pour les classes Abstract et AbstractBase.
En ce qui concerne la classe User ; est-ce possible/opportun de créer un modèle dans models.py qui hérite de User et ce même si c'est déjà le modèle utilisé par défaut par Django ? Si c'est le cas, la variable AUTH_USER_MODEL est-elle nécessaire ?
Le but serait de créer un autre modèle qui serait relié à la classe héritant de User par une ForeignKey.
En vous remerciant et en vous souhaitant une bonne soirée.
Salut Edouard !
Hériter directement de User n’est pas l’approche recommandée dans Django (pour faire court : tu vas être pas mal bloqué dans ce que fait déjà Django, et si jamais ils changent cette classe dans le futur ou que tu souhaites apporter plus de modifications que prévues, ça peut te causer beaucoup de problèmes et avoir des problèmes dans sa classe User avec une app en prod est vraiment la dernière chose que tu souhaites 😅).
Ce qu'on fait généralement, c'est donc de créer une classe qui hérite de AbstractUser. Ça te permet de garder tous les avantages de User, en ajoutant tes propres champs et méthodes.
Si je comprends bien tu aurais souhaité faire quelque chose du genre :
from django.contrib.auth.models import User
class CustomUser(User):
pass
Et une autre classe reliée à celle-ci :
from django.contrib.auth.models import User
class UserProfile(User):
user = models.ForeignKey(CustomUser, on_delete=models.CASCADE)
Si c'est bien ce que tu avais en tête, tu peux faire la même chose du coup mais en héritant tout simplement de AbstractUser à la place.
from django.contrib.auth.models import AbstractUser
class CustomUser(AbstractUser):
# Ici, tu peux ajouter tes champs personnalisés
middle_name = models.CharField()
Et ensuite, oui, tu dois dire à Django d'utiliser ton modèle personnalisé comme modèle d'utilisateur principal. Tu le fais en réglant la variable AUTH_USER_MODEL dans ton fichier settings.py comme ceci :
AUTH_USER_MODEL = 'myapp.CustomUser'
En remplaçant 'myapp' par le nom de ton application Django.
Maintenant, pour ton modèle qui veut établir une relation avec ton utilisateur, tu utiliseras une clé étrangère vers ton CustomUser :
from django.conf import settings
class UserProfile(models.Model):
user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
# Et puis tous les autres champs que tu veux pour ce profil.
Comme ça, tu peux avoir un modèle UserProfile pour chaque utilisateur, contenant toutes les infos supplémentaires que tu veux.
C'est généralement ce que l'on fait, sinon tu peux aussi tout mettre dans ta classe CustomUser.
N'hésite pas à me dire si ce n'était pas exactement ce que tu voulais dire dans ta question :)
Ça fait un peu peur les modèles d'utilisateur au début, il y a beaucoup d'options et de possibilité. Après c'est le genre de choses qu'on fait une fois au début de projet et qu'on touche peu par la suite. Chaque fois que je me relance dans un projet je dois étudier le sujet de nouveau parce que je ne me souviens plus de toutes les petites spécificités, donc c'est normal ;)
Bonjour Thibault,
C'est exactement ce que je voulais faire donc merci beaucoup pour ces précisions ainsi que pour les exemples.
Effectivement, je me disais bien que renseigner la variable AUTH_USER_MODEL avec une valeur qui pointe sur un modèle qui hériterait d'User alors que c'est le modèle par défaut, ça pouvait entraîner des conflits...
Je vais alors passer par AbstractUser et mettre les mains dans la camboui dans un projet d'entraînement.
Merci encore et bonne journée.
Inscris-toi
(c'est gratuit !)
Tu dois créer un compte pour participer aux discussions.
Créer un compte