Introducció

Les senyalitzacions (signals) en Django són una eina poderosa que permet la comunicació entre diferents parts d'una aplicació. Les senyalitzacions permeten que certs remitents (senders) notifiquin a un conjunt de receptors (receivers) quan es produeixen determinats esdeveniments. Això és especialment útil per desacoblar components de l'aplicació i permetre una major modularitat.

Conceptes Clau

  • Senyalització (Signal): Un objecte que representa un esdeveniment que pot ser enviat i rebut.
  • Remitent (Sender): L'objecte que envia la senyalització.
  • Receptor (Receiver): La funció que rep i maneja la senyalització.
  • Connexió (Connection): El procés de vincular un receptor a una senyalització.

Senyalitzacions Integrades en Django

Django proporciona diverses senyalitzacions integrades que es poden utilitzar per respondre a esdeveniments comuns, com ara la creació o eliminació d'objectes. Algunes de les senyalitzacions més utilitzades són:

  • pre_save i post_save: S'envien abans i després de desar un objecte.
  • pre_delete i post_delete: S'envien abans i després d'eliminar un objecte.
  • m2m_changed: S'envia quan es modifica una relació ManyToMany.

Exemple Pràctic

  1. Creació d'una Senyalització Personalitzada

Primer, crearem una senyalització personalitzada. Suposem que volem enviar una senyalització cada vegada que es crea un nou usuari.

# signals.py
from django.dispatch import Signal

# Definim la senyalització
user_created = Signal(providing_args=["user"])

  1. Enviament de la Senyalització

Enviarem la senyalització des de la vista on es crea l'usuari.

# views.py
from django.contrib.auth.models import User
from django.shortcuts import render
from .signals import user_created

def create_user(request):
    if request.method == 'POST':
        username = request.POST['username']
        password = request.POST['password']
        user = User.objects.create_user(username=username, password=password)
        
        # Enviem la senyalització
        user_created.send(sender=User, user=user)
        
        return render(request, 'user_created.html', {'user': user})
    return render(request, 'create_user.html')

  1. Connexió d'un Receptor a la Senyalització

Ara, connectarem un receptor a la nostra senyalització personalitzada.

# receivers.py
from django.dispatch import receiver
from .signals import user_created

@receiver(user_created)
def user_created_handler(sender, **kwargs):
    user = kwargs['user']
    print(f"Nou usuari creat: {user.username}")

  1. Registre del Receptor

Finalment, assegurem-nos que el receptor es registri quan l'aplicació es carregui. Això es pot fer en el fitxer apps.py de l'aplicació.

# apps.py
from django.apps import AppConfig

class MyAppConfig(AppConfig):
    name = 'myapp'

    def ready(self):
        import myapp.receivers

Exercici Pràctic

Exercici

  1. Crea una senyalització que s'enviï cada vegada que es modifiqui un objecte Profile.
  2. Connecta un receptor a aquesta senyalització que imprimeixi un missatge amb el nom d'usuari del perfil modificat.

Solució

1. Definició de la Senyalització

# signals.py
from django.dispatch import Signal

profile_updated = Signal(providing_args=["profile"])

2. Enviament de la Senyalització

# models.py
from django.db.models.signals import post_save
from django.dispatch import receiver
from .signals import profile_updated
from .models import Profile

@receiver(post_save, sender=Profile)
def profile_post_save(sender, instance, **kwargs):
    profile_updated.send(sender=Profile, profile=instance)

3. Connexió del Receptor

# receivers.py
from django.dispatch import receiver
from .signals import profile_updated

@receiver(profile_updated)
def profile_updated_handler(sender, **kwargs):
    profile = kwargs['profile']
    print(f"Perfil actualitzat: {profile.user.username}")

4. Registre del Receptor

# apps.py
from django.apps import AppConfig

class MyAppConfig(AppConfig):
    name = 'myapp'

    def ready(self):
        import myapp.receivers

Conclusió

Les senyalitzacions de Django són una eina poderosa per desacoblar components de l'aplicació i permetre una major modularitat. En aquest tema, hem après a crear senyalitzacions personalitzades, enviar-les i connectar receptors per manejar-les. Amb aquesta eina, pots millorar la comunicació entre diferents parts de la teva aplicació de manera eficient i elegant.

© Copyright 2024. Tots els drets reservats