Looking for django Keywords? Try Ask4Keywords

Django Especificación de un modelo de usuario personalizado


Ejemplo

El modelo de User incorporado de Django no siempre es apropiado para algunos tipos de proyectos. En algunos sitios, podría tener más sentido utilizar una dirección de correo electrónico en lugar de un nombre de usuario, por ejemplo.

Puede anular el modelo de User predeterminado al agregar su modelo de User personalizado a la configuración AUTH_USER_MODEL , en el archivo de configuración de sus proyectos:

AUTH_USER_MODEL = 'myapp.MyUser'

Tenga en cuenta que es altamente AUTH_USER_MODEL crear AUTH_USER_MODEL antes de crear cualquier migración o ejecutar manage.py migrate por primera vez. Debido a las limitaciones de la característica de dependencia synamic de Django.

Por ejemplo, en su blog, es posible que desee que otros autores puedan iniciar sesión con una dirección de correo electrónico en lugar del nombre de usuario habitual, por lo que creamos un modelo de User personalizado con una dirección de correo electrónico como USERNAME_FIELD :

from django.contrib.auth.models import AbstractBaseUser

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

Al heredar el AbstractBaseUser podemos construir un modelo de User compatible. AbstractBaseUser proporciona la implementación central de un modelo de User .

Para que el comando Django manage.py createsuperuser sepa qué otros campos son necesarios, podemos especificar un REQUIRED_FIELDS . Este valor no tiene efecto en otras partes 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']

Para cumplir con otra parte de Django, todavía tenemos que especificar el valor is_active , las funciones get_full_name() y 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

También debe crear un UserManager personalizado para su modelo de User , que le permita a Django usar las create_user() y 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