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