Django signals allow decoupled communication between components when actions occur.
1from django.db.models.signals import post_save, pre_delete2from django.dispatch import receiver3from django.contrib.auth.models import User45# Signal handler6@receiver(post_save, sender=User)7def create_profile(sender, instance, created, **kwargs):8 if created:9 Profile.objects.create(user=instance)10 print(f"Profile created for {instance.username}")1112@receiver(pre_delete, sender=User)13def cleanup_data(sender, instance, **kwargs):14 # Clean up related data before deletion15 instance.profile.delete()16 instance.posts.all().delete()1718# Custom signals19from django.dispatch import Signal2021order_completed = Signal() # Signal definition2223# Sending signal24order_completed.send(25 sender=Order,26 order_id=order.id,27 total=order.total28)2930# Connecting handler31order_completed.connect(send_confirmation_email)
Built-in signals:
pre_save / post_save.pre_delete / post_delete.m2m_changed.request_started / request_finished.When to use: