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
ipost_save
: S'envien abans i després de desar un objecte.pre_delete
ipost_delete
: S'envien abans i després d'eliminar un objecte.m2m_changed
: S'envia quan es modifica una relació ManyToMany.
Exemple Pràctic
- 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"])
- 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')
- 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}")
- 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
- Crea una senyalització que s'enviï cada vegada que es modifiqui un objecte
Profile
. - 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.
Curs de Desenvolupament Web amb Django
Mòdul 1: Introducció a Django
- Què és Django?
- Configuració de l'Entorn de Desenvolupament
- Creació del teu Primer Projecte Django
- Comprensió de l'Estructura del Projecte Django
Mòdul 2: Conceptes Bàsics de Django
- Aplicacions Django i Estructura del Projecte
- Enrutament d'URL i Vistes
- Plantilles i Fitxers Estàtics
- Models i Bases de Dades
- Interfície d'Administració de Django
Mòdul 3: Django Intermedi
Mòdul 4: Django Avançat
- Consultes Avançades amb Django ORM
- Models d'Usuari Personalitzats
- Senyalitzacions de Django
- Proves en Django
- Optimització del Rendiment