1what are django signals?
2
3The Django Signals is a strategy to allow decoupled applications to get notified when certain events occur
4
5There are two key elements in the signals machinary: the senders and the receivers. As the name suggests, the sender is the one responsible to dispatch a signal, and the receiver is the one who will receive this signal and then do something.
6
7A receiver must be a function or an instance method which is to receive signals.
8
9A sender must either be a Python object, or None to receive events from any sender.
10
11The connection between the senders and the receivers is done through “signal dispatchers”, which are instances of Signal, via the connect method.
12So to receive a signal, you need to register a receiver function that gets called when the signal is sent by using the Signal.connect() method.
13
1django post_save signals
2
3Let’s have a look on the post_save built-in signal. Its code lives in the django.db.models.signals module. This particular signal fires right after a model finish executing its save method.
4
5from django.contrib.auth.models import User
6from django.db.models.signals import post_save
7
8def save_profile(sender, instance, **kwargs):
9 instance.profile.save()
10
11post_save.connect(save_profile, sender=User)
12
13Another way to register a signal, is by using the @receiver decorator:
14
15from django.contrib.auth.models import User
16from django.db.models.signals import post_save
17from django.dispatch import receiver
18
19@receiver(post_save, sender=User)
20def save_profile(sender, instance, **kwargs):
21 instance.profile.save()
22
1django built-in signals
2
3Django's built-in Signals:
4Django provides a set of built-in signals that let user code get notified by Django itself of certain actions. These include some useful notifications:
5
6django.db.models.signals.pre_save & django.db.models.signals.post_save : Sent before or after a model's save() method is called
7django.db.models.signals.pre_delete & django.db.models.signals.post_delete : Sent before or after a model's delete() method or queryset's delete() method is called
8django.db.models.signals.m2m_changed : Sent when a ManyToManyField on a model is changed
9django.core.signals.request_started & django.core.signals.request_finished : Sent when Django starts or finishes an HTTP request