Las señales en Django son una poderosa herramienta que permite a los desarrolladores desacoplar partes de su aplicación. Las señales permiten que ciertos emisores notifiquen a múltiples receptores cuando ocurren eventos específicos. Esto es útil para ejecutar código en respuesta a ciertos eventos sin tener que modificar el código del emisor.
Conceptos Clave
- Emisor (Sender): El objeto que envía la señal.
- Receptor (Receiver): La función que recibe la señal y ejecuta alguna acción.
- Señal (Signal): El evento que se emite y que los receptores pueden escuchar.
Señales Integradas en Django
Django proporciona varias señales integradas que puedes usar, como:
pre_saveypost_save: Emitidas antes y después de que un modelo se guarda.pre_deleteypost_delete: Emitidas antes y después de que un modelo se elimina.m2m_changed: Emitida cuando una relación ManyToManyField cambia.
Ejemplo Práctico
Vamos a crear un ejemplo práctico donde utilizamos señales para enviar un correo electrónico cada vez que se crea un nuevo usuario.
Paso 1: Configuración del Proyecto
Asegúrate de tener un proyecto Django configurado. Si no lo tienes, sigue los pasos en los módulos anteriores para configurarlo.
Paso 2: Crear una Aplicación
Crea una nueva aplicación llamada accounts:
Paso 3: Definir el Modelo de Usuario
En accounts/models.py, define un modelo de usuario simple:
from django.db import models
from django.contrib.auth.models import AbstractUser
class CustomUser(AbstractUser):
passPaso 4: Registrar la Señal
Crea un archivo signals.py en la aplicación accounts y define una señal que se ejecutará después de que un usuario se guarde:
# accounts/signals.py
from django.db.models.signals import post_save
from django.dispatch import receiver
from django.core.mail import send_mail
from django.conf import settings
from .models import CustomUser
@receiver(post_save, sender=CustomUser)
def send_welcome_email(sender, instance, created, **kwargs):
if created:
send_mail(
'Welcome!',
'Thank you for signing up for our site.',
settings.DEFAULT_FROM_EMAIL,
[instance.email],
fail_silently=False,
)Paso 5: Conectar la Señal
En accounts/apps.py, conecta la señal cuando la aplicación se carga:
# accounts/apps.py
from django.apps import AppConfig
class AccountsConfig(AppConfig):
name = 'accounts'
def ready(self):
import accounts.signalsPaso 6: Actualizar INSTALLED_APPS
Asegúrate de que accounts esté en INSTALLED_APPS en settings.py:
Paso 7: Migrar y Probar
Realiza las migraciones y prueba la funcionalidad:
Crea un nuevo usuario y verifica que se envíe el correo electrónico de bienvenida.
Ejercicio Práctico
Ejercicio 1: Crear una Señal para pre_save
Crea una señal que se ejecute antes de que un modelo BlogPost se guarde, y que automáticamente establezca el campo slug basado en el título del post.
- Define el modelo
BlogPostenmodels.py:
# models.py
from django.db import models
from django.utils.text import slugify
class BlogPost(models.Model):
title = models.CharField(max_length=200)
content = models.TextField()
slug = models.SlugField(unique=True, blank=True)
def __str__(self):
return self.title- Crea la señal en
signals.py:
# signals.py
from django.db.models.signals import pre_save
from django.dispatch import receiver
from .models import BlogPost
@receiver(pre_save, sender=BlogPost)
def set_slug(sender, instance, **kwargs):
if not instance.slug:
instance.slug = slugify(instance.title)- Conecta la señal en
apps.py:
# apps.py
from django.apps import AppConfig
class BlogConfig(AppConfig):
name = 'blog'
def ready(self):
import blog.signals- Actualiza
INSTALLED_APPSy realiza las migraciones.
Solución
La solución ya está integrada en los pasos anteriores. Asegúrate de seguir cada paso y verificar que el slug se establece automáticamente antes de guardar un BlogPost.
Conclusión
Las señales en Django son una herramienta poderosa para desacoplar partes de tu aplicación y ejecutar código en respuesta a eventos específicos. En este módulo, aprendiste cómo usar señales integradas y cómo crear tus propias señales personalizadas. Practica creando y conectando señales para familiarizarte con esta funcionalidad esencial de Django.
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
