Django signals allow you to automatically perform actions in response to specific events such as saving or deleting a model. They help keep your code modular, clean, and event-driven.
post_save and post_deleteA signal connects a sender (model) with a receiver (function). When the sender triggers an event, Django executes the receiver automatically.
# Automatically create a profile when a new user is created
from django.db.models.signals import post_save
from django.dispatch import receiver
from django.contrib.auth.models import User
from .models import Profile
@receiver(post_save, sender=User)
def create_user_profile(sender, instance, created, **kwargs):
if created:
Profile.objects.create(user=instance)
# Send a welcome email after user registration
from django.db.models.signals import post_save
from django.dispatch import receiver
from django.core.mail import send_mail
from django.contrib.auth.models import User
@receiver(post_save, sender=User)
def send_welcome_email(sender, instance, created, **kwargs):
if created:
send_mail(
'Welcome to Our Website',
'Thank you for registering with us!',
'from@example.com',
[instance.email],
fail_silently=False,
)
# Delete user profile picture after user deletion
from django.db.models.signals import post_delete
from django.dispatch import receiver
from django.contrib.auth.models import User
import os
@receiver(post_delete, sender=User)
def delete_user_files(sender, instance, **kwargs):
if instance.profile.picture:
path = instance.profile.picture.path
if os.path.exists(path):
os.remove(path)
Think of signals as automatic hooks that react to model events without being explicitly called in views or forms.
Click the button to simulate a user signing up. Watch how the database save triggers the signal, which then triggers the receivers automatically.
post_delete