Django Spécification d'un modèle d'utilisateur personnalisé


Exemple

Le modèle d' User intégré de Django n'est pas toujours adapté à certains types de projets. Sur certains sites, il peut être plus judicieux d'utiliser une adresse e-mail plutôt qu'un nom d'utilisateur, par exemple.

Vous pouvez remplacer le modèle d' User par défaut en ajoutant votre modèle d' User personnalisé au paramètre AUTH_USER_MODEL , dans le fichier de paramètres de vos projets:

AUTH_USER_MODEL = 'myapp.MyUser'

Notez qu'il est fortement recommandé de créer AUTH_USER_MODEL avant de créer des migrations ou d'exécuter manage.py migrate pour la première fois. En raison des limitations de la fonction de dépendance synamique de Django.

Par exemple, sur votre blog, vous voudrez peut-être que d'autres auteurs puissent se connecter avec une adresse e-mail au lieu du nom d'utilisateur habituel. Nous créons donc un modèle d' User personnalisé avec une adresse e-mail comme USERNAME_FIELD :

from django.contrib.auth.models import AbstractBaseUser

class CustomUser(AbstractBaseUser):
     email = models.EmailField(unique=True)
     
     USERNAME_FIELD = 'email'

En héritant de AbstractBaseUser nous pouvons construire un modèle d' User conforme. AbstractBaseUser fournit l'implémentation principale d'un modèle d' User .

Pour que la commande Django manage.py createsuperuser sache quels autres champs sont nécessaires, nous pouvons spécifier un REQUIRED_FIELDS . Cette valeur n'a aucun effet dans d'autres parties de Django!

class CustomUser(AbstractBaseUser):
    ...
    first_name = models.CharField(max_length=254)
    last_name = models.CharField(max_length=254)
    ...
    REQUIRED_FIELDS = ['first_name', 'last_name']

Pour être compatible avec une autre partie de Django, nous devons toujours spécifier la valeur is_active , les fonctions get_full_name() et get_short_name() :

class CustomUser(AbstractBaseUser):
    ...
    is_active = models.BooleanField(default=False)
    ...
    def get_full_name(self):
        full_name = "{0} {1}".format(self.first_name, self.last_name)
        return full_name.strip()

    def get_short_name(self):
        return self.first_name

Vous devez également créer un UserManager personnalisé pour votre modèle User , ce qui permet à Django d'utiliser les fonctions create_user() et create_superuser() :

from django.contrib.auth.models import BaseUserManager

class CustomUserManager(BaseUserManager):
    def create_user(self, email, first_name, last_name, password=None):
        if not email:
            raise ValueError('Users must have an email address')

        user = self.model(
            email=self.normalize_email(email),
        )

        user.set_password(password)
        user.first_name = first_name
        user.last_name = last_name
        user.save(using=self._db)
        return user

    def create_superuser(self, email, first_name, last_name, password):
        user = self.create_user(
            email=email,
            first_name=first_name,
            last_name=last_name,
            password=password,
        )

        user.is_admin = True
        user.is_active = True
        user.save(using=self.db)
        return user