DEV Community

loading...
Cover image for Django Signals

Django Signals

Kritebh Lagan Bibhakar
Arranging 0 and 1 correctly
・2 min read

Signal is one of the useful feature provided by Django, so let's talk about it.

  • What is Signal
  • How to use Built-in Signal
  • How to create a custom one

What is Signal

Yes, it is the same as you are thinking, as its name suggests "Signal" gives notification to a sender at a specific event.
Let's say you want to get notified every time a guest visited your house.

You can set up a doorbell which will give you a signal that someone has arrived.

Django Signals works in the same manner whenever some event happens it sends a signal to do some defined task.
So you can use Signal when many codes are interested in a particular event.

Built-in Signals

There are awesome Built-in signals available which you can easily use.
Let's say I want to do something before an instance saved in my Post model.
First of all, I will create a Post model and then import a signal i.e. "pre_save"

  • My models.py files will look like this -
from django.db import models
from django.db.models.signals import pre_save,post_save  #Inbuilt Signals
# Create your models here.

class Post(models.Model):
    title = models.CharField(max_length=30)

    def __str__(self):
        return self.title

def save_post(sender,instance,**kwargs):
    print("Pre save")

pre_save.connect(save_post,sender=Post) # This will trigger after the saving data into Post model
Enter fullscreen mode Exit fullscreen mode

So when I save something in Post model I get the message "Pre Save"

pre_save django signals

Similarly you can do something after saving an instance using post_save signals.

Simple...

Here is the list for all Built-in Django Signals

There is another famous one request_finished which you can use after a request is finished.

Custom Signals

So far so good but how we can create a custom one.

wherever you want to use signals you have to import signals and receiver.

Then create an object of Signals class and then define a sender and receiver.

  • views.py file
from django.shortcuts import render,HttpResponse
from django.core.signals import request_finished
from django.dispatch import receiver,Signal
from .models import Post

# Create your views here.
time_stamp = Signal(providing_args=['timestamp'])
def home(request):
    time_stamp.send(sender=None,timestamp="30/05/2021")
    return HttpResponse("Home Page")

## Custom Signal
@receiver(time_stamp)
def own_track(sender,**kwargs):
    print(kwargs)
Enter fullscreen mode Exit fullscreen mode

Easy

So, if you have any suggestions or feedback let me know in the comment.

Thanks for reading.

Cover Image - Photo by Chinh Le Duc on Unsplash

Discussion (3)

Collapse
sayf_a_cc723da8bec754a8cd profile image
Sayf A

epic tutorial dude!

Collapse
kritebh profile image
Kritebh Lagan Bibhakar Author

Thanks Sayf

Collapse
cenacr007_harsh profile image
KUMAR HARSH

Nice tutorial.