Trigger decoupled side effects with post_save and pre_delete signals.
Django Signals
from django.db.models.signals import post_save, pre_delete, m2m_changed
from django.contrib.auth.signals import user_logged_in
from django.dispatch import receiver
@receiver(post_save, sender=User)
def create_user_profile(sender, instance, created, **kwargs):
if created:
Profile.objects.create(user=instance)
@receiver(post_save, sender=Post)
def notify_followers(sender, instance, created, **kwargs):
if created and not instance.is_draft:
for follower in instance.author.followers.all():
Notification.objects.create(
user = follower,
message = str(instance.author) + " published: " + instance.title
)
@receiver(pre_delete, sender=Post)
def cleanup_files(sender, instance, **kwargs):
if instance.image:
instance.image.delete(save=False)
# Connect explicitly (when you cannot use decorator)
post_save.connect(create_user_profile, sender=User)