Django signals are a powerful feature that allows different parts of your application to communicate with each other. They enable you to create a decoupled architecture by listening to certain events and reacting accordingly. In this article, we’ll explore three diverse examples of Django signals that demonstrate their practical use cases.
When a new user registers on your website, you might want to automatically create a profile for them. This example shows how to use Django signals to achieve that.
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)
In this code snippet, we are using the post_save
signal to listen for the event that occurs after a new User
instance is saved. If the instance is newly created (i.e., a new user registered), we then create a corresponding Profile
instance for that user. This automation can save you time and ensure every user has a profile.
Profile
model based on your application’s needs.In some applications, you may want to send an email notification whenever an important model is deleted. Here’s how you can implement this using Django signals.
from django.db.models.signals import post_delete
from django.dispatch import receiver
from django.core.mail import send_mail
from .models import ImportantModel
@receiver(post_delete, sender=ImportantModel)
def send_deletion_email(sender, instance, **kwargs):
subject = 'Important Model Deleted'
message = f'An important model titled {instance.title} has been deleted.'
send_mail(subject, message, 'from@example.com', ['admin@example.com'], fail_silently=False)
In this example, we listen for the post_delete
signal on the ImportantModel
. When an instance of this model is deleted, we trigger an email notification to the admin. This can be particularly useful for auditing purposes or keeping track of significant changes.
You might want to keep track of when a model instance was last updated. This example demonstrates how to automatically update a timestamp field each time the instance is saved.
from django.db.models.signals import pre_save
from django.dispatch import receiver
from django.utils import timezone
from .models import MyModel
@receiver(pre_save, sender=MyModel)
def update_timestamp(sender, instance, **kwargs):
instance.updated_at = timezone.now()
In this snippet, we use the pre_save
signal to update the updated_at
field of MyModel
right before it is saved. This ensures that every time the instance is modified, the timestamp reflects the latest modification time.
updated_at
field is defined in your model.By using these examples of Django signals example, you can enhance the functionality of your applications while keeping your code organized and maintainable. Happy coding!