Ampliación del modelo de usuario en Django

Ampliación del modelo de usuario en Django

Personalización y extensión del sistema de autenticación

Django, uno de los marcos de desarrollo web más populares de Python, incluye un sistema de autenticación incorporado que gestiona la autenticación de usuarios, pero a menudo es necesario personalizarlo para satisfacer las necesidades específicas de una aplicación. Esto se logra a través de la ampliación del modelo de usuario predeterminado de Django, lo que permite agregar campos personalizados y funcionalidades adicionales al sistema de autenticación. En este artículo, exploraremos en detalle cómo extender el modelo de usuario en Django, cuándo y por qué hacerlo, y proporcionaremos ejemplos prácticos.

El modelo de usuario predeterminado en Django

Django proporciona un modelo de usuario predeterminado que incluye campos como nombre de usuario, contraseña, correo electrónico y otros. Este modelo satisface las necesidades de muchas aplicaciones, pero en situaciones en las que se requiere información adicional del usuario o funcionalidades específicas, es necesario personalizarlo.

Cuándo personalizar el modelo de usuario

La personalización del modelo de usuario es relevante en situaciones donde:

  1. Información adicional del usuario: Si necesita recopilar información adicional del usuario, como un número de teléfono, dirección, fecha de nacimiento, etc.

  2. Rol o nivel de acceso personalizado: Cuando se requieren roles o niveles de acceso personalizados para los usuarios, como administradores, moderadores, suscriptores, etc.

  3. Registro a través de terceros: Para habilitar el registro y la autenticación de usuarios a través de proveedores externos, como Facebook, Google o Twitter.

  4. Permisos personalizados: Cuando es necesario otorgar permisos específicos a usuarios para controlar su acceso a ciertas partes de la aplicación.

  5. Cualquier otro requisito específico de la aplicación: En general, siempre que las necesidades de su aplicación no se ajusten perfectamente al modelo de usuario predeterminado de Django, es recomendable personalizar el modelo de usuario.

Extensión del modelo de usuario

Django ofrece dos formas principales de extender el modelo de usuario: heredar del modelo de usuario predeterminado o crear un modelo de usuario personalizado desde cero. A continuación, se describen ambos enfoques.

Heredar del modelo de usuario predeterminado

El enfoque más común para extender el modelo de usuario es heredar del modelo de usuario predeterminado de Django y agregar campos personalizados. Aquí hay un ejemplo de cómo hacerlo:

from django.contrib.auth.models import AbstractUser

class CustomUser(AbstractUser):
    # Agregar campos personalizados
    fecha_de_nacimiento = models.DateField()
    numero_de_telefono = models.CharField(max_length=15)

En este ejemplo, hemos creado un modelo CustomUser que hereda del modelo AbstractUser predeterminado de Django. Luego, hemos agregado campos personalizados como fecha_de_nacimiento y numero_de_telefono.

Crear un modelo de usuario personalizado

La otra opción es crear un modelo de usuario personalizado desde cero. Esto le brinda un mayor control sobre la estructura del modelo de usuario, pero implica más trabajo. Aquí hay un ejemplo de cómo hacerlo:

from django.db import models
from django.contrib.auth.models import BaseUserManager, AbstractBaseUser, PermissionsMixin

class CustomUserManager(BaseUserManager):
    def create_user(self, email, password=None, **extra_fields):
        if not email:
            raise ValueError('El Email es obligatorio')
        email = self.normalize_email(email)
        user = self.model(email=email, **extra_fields)
        user.set_password(password)
        user.save(using=self._db)
        return user

    def create_superuser(self, email, password=None, **extra_fields):
        extra_fields.setdefault('is_staff', True)
        extra_fields.setdefault('is_superuser', True)

        if extra_fields.get('is_staff') is not True:
            raise ValueError('El superusuario debe tener is_staff=True')
        if extra_fields.get('is_superuser') is not True:
            raise ValueError('El superusuario debe tener is_superuser=True')

        return self.create_user(email, password, **extra_fields)

class CustomUser(AbstractBaseUser, PermissionsMixin):
    email = models.EmailField(unique=True)
    nombre = models.CharField(max_length=30)
    is_active = models.BooleanField(default=True)
    is_staff = models.BooleanField(default=False)

    objects = CustomUserManager()

    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = ['nombre']

    def __str__(self):
        return self.email

En este ejemplo, hemos creado un modelo CustomUser desde cero. Hemos definido un gestor de usuario personalizado CustomUserManager que maneja la creación de usuarios y superusuarios. Además, hemos especificado campos como email, nombre, is_active y is_staff, y hemos heredado de las clases AbstractBaseUser y PermissionsMixin.

Personalización del modelo de usuario

Una vez que haya extendido o creado su modelo de usuario, puede personalizarlo aún más agregando métodos y propiedades que sean específicos de su aplicación. Por ejemplo, puede agregar un método que calcule la edad del usuario a partir de su fecha de nacimiento o una propiedad que devuelva el nombre completo del usuario.

from datetime import date

class CustomUser(AbstractBaseUser, PermissionsMixin):
    # ...

    @property
    def edad(self):
        if self.fecha_de_nacimiento:
            today = date.today()
            age = today.year - self.fecha_de_nacimiento.year - ((today.month, today.day) < (self.fecha_de_nacimiento.month, self.fecha_de_nacimiento.day))
            return age
        return None

    def nombre_completo(self):
        return f'{self.nombre} {self.apellido}'

Integración en el sistema de autenticación

Para asegurarse de que su modelo de usuario personalizado sea utilizado para la autenticación, debe configurarlo en la configuración de autenticación de Django. Esto se hace en el archivo settings.py de su proyecto.

AUTH_USER_MODEL = 'myapp.CustomUser'

Reemplace 'myapp' con la ruta a su aplicación donde se encuentra el modelo de usuario personalizado.

Migración de la base de datos

Después de personalizar o extender su modelo de usuario, deberá crear y aplicar las migraciones para reflejar los cambios en la base de datos.

python manage.py makemigrations
python manage.py migrate

Conclusión

La ampliación del modelo de usuario en Django es una práctica común y útil para adaptar el sistema de autenticación a las necesidades específicas de su aplicación. Ya sea que necesite campos adicionales para el perfil del usuario, roles personalizados, permisos específicos o cualquier otra funcionalidad especial, Django le proporciona las herramientas para personalizar el modelo de usuario de acuerdo a sus requerimientos. Aproveche al máximo esta flexibilidad para crear aplicaciones web potentes y personalizadas que se adapten a sus necesidades precisas.