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

  1. Emisor (Sender): El objeto que envía la señal.
  2. Receptor (Receiver): La función que recibe la señal y ejecuta alguna acción.
  3. 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_save y post_save: Emitidas antes y después de que un modelo se guarda.
  • pre_delete y post_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:

python manage.py startapp 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):
    pass

Paso 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.signals

Paso 6: Actualizar INSTALLED_APPS

Asegúrate de que accounts esté en INSTALLED_APPS en settings.py:

# settings.py
INSTALLED_APPS = [
    ...
    'accounts',
    ...
]

Paso 7: Migrar y Probar

Realiza las migraciones y prueba la funcionalidad:

python manage.py makemigrations accounts
python manage.py migrate

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.

  1. Define el modelo BlogPost en models.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
  1. 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)
  1. 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
  1. Actualiza INSTALLED_APPS y 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.

© Copyright 2024. Todos los derechos reservados