DEV Community

Cover image for Django Signals
Kritebh Lagan Bibhakar
Kritebh Lagan Bibhakar

Posted on

Django Signals

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

Latest comments (3)

Collapse
 
cenacr007_harsh profile image
KUMAR HARSH

Nice tutorial.

Collapse
 
sayf_a_cc723da8bec754a8cd profile image
Sayf A

epic tutorial dude!

Collapse
 
kritebh profile image
Kritebh Lagan Bibhakar

Thanks Sayf