En este tema, aprenderemos cómo crear y utilizar modelos de usuario personalizados en Django. Los modelos de usuario personalizados son útiles cuando necesitas extender o modificar el modelo de usuario predeterminado de Django para adaptarlo a los requisitos específicos de tu aplicación.

Contenido

Introducción a los Modelos de Usuario Personalizados

Django proporciona un modelo de usuario predeterminado que es adecuado para muchas aplicaciones. Sin embargo, en algunos casos, es posible que necesites agregar campos adicionales o modificar el comportamiento del modelo de usuario. Para estos casos, Django permite crear modelos de usuario personalizados.

Ventajas de los Modelos de Usuario Personalizados

  • Flexibilidad: Puedes agregar campos adicionales y métodos personalizados.
  • Escalabilidad: Facilita la adaptación del modelo de usuario a medida que crece tu aplicación.
  • Mantenimiento: Mantiene el código limpio y organizado al centralizar la lógica del usuario en un solo lugar.

Creación de un Modelo de Usuario Personalizado

Para crear un modelo de usuario personalizado, sigue estos pasos:

  1. Crear una nueva aplicación: Si aún no tienes una aplicación para gestionar usuarios, crea una nueva.

    python manage.py startapp accounts
    
  2. Definir el modelo de usuario personalizado: En el archivo models.py de la aplicación accounts, define tu modelo de usuario personalizado.

    from django.contrib.auth.models import AbstractBaseUser, BaseUserManager, PermissionsMixin
    from django.db import models
    
    class CustomUserManager(BaseUserManager):
        def create_user(self, email, password=None, **extra_fields):
            if not email:
                raise ValueError('El email debe ser proporcionado')
            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)
        first_name = models.CharField(max_length=30, blank=True)
        last_name = models.CharField(max_length=30, blank=True)
        is_active = models.BooleanField(default=True)
        is_staff = models.BooleanField(default=False)
        date_joined = models.DateTimeField(auto_now_add=True)
    
        objects = CustomUserManager()
    
        USERNAME_FIELD = 'email'
        REQUIRED_FIELDS = []
    
        def __str__(self):
            return self.email
    

Explicación del Código

  • CustomUserManager: Este es el administrador de usuarios personalizado que define cómo se crean los usuarios y superusuarios.
  • CustomUser: Este es el modelo de usuario personalizado que extiende AbstractBaseUser y PermissionsMixin. Define los campos adicionales y el comportamiento del usuario.

Configuración del Modelo de Usuario Personalizado

Para que Django utilice tu modelo de usuario personalizado, debes configurarlo en el archivo settings.py de tu proyecto.

# settings.py
AUTH_USER_MODEL = 'accounts.CustomUser'

Migraciones y Administración

  1. Crear y aplicar migraciones: Genera y aplica las migraciones para crear la tabla del modelo de usuario personalizado en la base de datos.

    python manage.py makemigrations
    python manage.py migrate
    
  2. Registrar el modelo en el administrador: Para gestionar usuarios desde la interfaz de administración de Django, registra el modelo de usuario personalizado en admin.py.

    from django.contrib import admin
    from django.contrib.auth.admin import UserAdmin
    from .models import CustomUser
    
    class CustomUserAdmin(UserAdmin):
        model = CustomUser
        list_display = ('email', 'first_name', 'last_name', 'is_staff')
        search_fields = ('email', 'first_name', 'last_name')
        ordering = ('email',)
    
    admin.site.register(CustomUser, CustomUserAdmin)
    

Autenticación y Uso del Modelo de Usuario Personalizado

Django utiliza el modelo de usuario configurado en AUTH_USER_MODEL para todas las operaciones de autenticación. Puedes utilizar el modelo de usuario personalizado en tus vistas y formularios de la misma manera que el modelo de usuario predeterminado.

Ejemplo de Uso en una Vista

from django.contrib.auth import get_user_model
from django.shortcuts import render
from django.http import HttpResponse

def user_profile(request):
    User = get_user_model()
    user = User.objects.get(email=request.user.email)
    return HttpResponse(f'Perfil de usuario: {user.email}')

Ejercicio Práctico

Ejercicio

  1. Crea un modelo de usuario personalizado que incluya un campo adicional phone_number.
  2. Configura el modelo de usuario personalizado en settings.py.
  3. Crea y aplica las migraciones.
  4. Registra el modelo de usuario personalizado en la interfaz de administración.
  5. Crea una vista que muestre el phone_number del usuario autenticado.

Solución

  1. Definir el modelo de usuario personalizado:

    from django.contrib.auth.models import AbstractBaseUser, BaseUserManager, PermissionsMixin
    from django.db import models
    
    class CustomUserManager(BaseUserManager):
        def create_user(self, email, phone_number, password=None, **extra_fields):
            if not email:
                raise ValueError('El email debe ser proporcionado')
            email = self.normalize_email(email)
            user = self.model(email=email, phone_number=phone_number, **extra_fields)
            user.set_password(password)
            user.save(using=self._db)
            return user
    
        def create_superuser(self, email, phone_number, 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, phone_number, password, **extra_fields)
    
    class CustomUser(AbstractBaseUser, PermissionsMixin):
        email = models.EmailField(unique=True)
        phone_number = models.CharField(max_length=15, unique=True)
        first_name = models.CharField(max_length=30, blank=True)
        last_name = models.CharField(max_length=30, blank=True)
        is_active = models.BooleanField(default=True)
        is_staff = models.BooleanField(default=False)
        date_joined = models.DateTimeField(auto_now_add=True)
    
        objects = CustomUserManager()
    
        USERNAME_FIELD = 'email'
        REQUIRED_FIELDS = ['phone_number']
    
        def __str__(self):
            return self.email
    
  2. Configurar el modelo de usuario personalizado en settings.py:

    # settings.py
    AUTH_USER_MODEL = 'accounts.CustomUser'
    
  3. Crear y aplicar migraciones:

    python manage.py makemigrations
    python manage.py migrate
    
  4. Registrar el modelo en el administrador:

    from django.contrib import admin
    from django.contrib.auth.admin import UserAdmin
    from .models import CustomUser
    
    class CustomUserAdmin(UserAdmin):
        model = CustomUser
        list_display = ('email', 'phone_number', 'first_name', 'last_name', 'is_staff')
        search_fields = ('email', 'phone_number', 'first_name', 'last_name')
        ordering = ('email',)
    
    admin.site.register(CustomUser, CustomUserAdmin)
    
  5. Crear una vista que muestre el phone_number del usuario autenticado:

    from django.contrib.auth import get_user_model
    from django.shortcuts import render
    from django.http import HttpResponse
    
    def user_profile(request):
        User = get_user_model()
        user = User.objects.get(email=request.user.email)
        return HttpResponse(f'Número de teléfono del usuario: {user.phone_number}')
    

Conclusión

En esta sección, hemos aprendido cómo crear y utilizar modelos de usuario personalizados en Django. Hemos cubierto la creación del modelo, la configuración en settings.py, la gestión de migraciones y la integración con la interfaz de administración. Además, hemos visto cómo utilizar el modelo de usuario personalizado en nuestras vistas.

Con este conocimiento, puedes adaptar el modelo de usuario de Django a las necesidades específicas de tu aplicación, proporcionando una mayor flexibilidad y escalabilidad. En el próximo tema, exploraremos las señales de Django y cómo utilizarlas para ejecutar código en respuesta a ciertos eventos en tu aplicación.

© Copyright 2024. Todos los derechos reservados