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:
-
Crear una nueva aplicación: Si aún no tienes una aplicación para gestionar usuarios, crea una nueva.
python manage.py startapp accounts
-
Definir el modelo de usuario personalizado: En el archivo
models.py
de la aplicaciónaccounts
, 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
yPermissionsMixin
. 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.
Migraciones y Administración
-
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
-
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
- Crea un modelo de usuario personalizado que incluya un campo adicional
phone_number
. - Configura el modelo de usuario personalizado en
settings.py
. - Crea y aplica las migraciones.
- Registra el modelo de usuario personalizado en la interfaz de administración.
- Crea una vista que muestre el
phone_number
del usuario autenticado.
Solución
-
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
-
Configurar el modelo de usuario personalizado en
settings.py
:# settings.py AUTH_USER_MODEL = 'accounts.CustomUser'
-
Crear y aplicar migraciones:
python manage.py makemigrations python manage.py migrate
-
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)
-
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.
Curso de Desarrollo Web con Django
Módulo 1: Introducción a Django
- ¿Qué es Django?
- Configuración del Entorno de Desarrollo
- Creando tu Primer Proyecto Django
- Entendiendo la Estructura del Proyecto Django
Módulo 2: Conceptos Básicos de Django
- Aplicaciones Django y Estructura del Proyecto
- Enrutamiento de URL y Vistas
- Plantillas y Archivos Estáticos
- Modelos y Bases de Datos
- Interfaz de Administración de Django
Módulo 3: Django Intermedio
- Manejo de Formularios
- Vistas Basadas en Clases
- Autenticación de Usuarios
- Middleware
- Carga de Archivos
Módulo 4: Django Avanzado
- Consultas Avanzadas con Django ORM
- Modelos de Usuario Personalizados
- Señales de Django
- Pruebas en Django
- Optimización del Rendimiento