Bird
Raised Fist0
Djangoframework~10 mins

Connecting signal handlers in Django - Interactive Code Practice

Choose your learning style10 modes available

Start learning this pattern below

Jump into concepts and practice - no test required

or
Recommended
Test this pattern10 questions across easy, medium, and hard to know if this pattern is strong
Practice - 5 Tasks
Answer the questions below
1fill in blank
easy

Complete the code to import the Django signal dispatcher.

Django
from django.dispatch import [1]
Drag options to blanks, or click blank then click option'
ASignal
Breceiver
Cconnect
Dsend
Attempts:
3 left
💡 Hint
Common Mistakes
Importing 'Signal' instead of 'receiver'.
Trying to import 'connect' which is a method, not an import.
Using 'send' which is a method to send signals, not to connect handlers.
2fill in blank
medium

Complete the code to connect a signal handler to the post_save signal of a model.

Django
@receiver([1], sender=MyModel)
def my_handler(sender, instance, **kwargs):
    pass
Drag options to blanks, or click blank then click option'
Apre_delete
Bpre_save
Cpost_save
Dpost_delete
Attempts:
3 left
💡 Hint
Common Mistakes
Using pre_save which triggers before saving.
Using delete signals instead of save signals.
Not specifying the correct signal name.
3fill in blank
hard

Fix the error in the signal handler connection by completing the missing import.

Django
from django.db.models.signals import [1]

@receiver(post_save, sender=User)
def user_saved(sender, instance, **kwargs):
    print('User saved!')
Drag options to blanks, or click blank then click option'
Apre_save
Bpost_delete
Cpre_delete
Dpost_save
Attempts:
3 left
💡 Hint
Common Mistakes
Importing the wrong signal.
Not importing the signal at all.
Importing signals from the wrong module.
4fill in blank
hard

Fill both blanks to connect a handler to the pre_delete signal for the Article model.

Django
from django.db.models.signals import [1]

@receiver([2], sender=Article)
def before_delete(sender, instance, **kwargs):
    print('Article will be deleted')
Drag options to blanks, or click blank then click option'
Apre_delete
Bpost_save
Cpre_save
Dpost_delete
Attempts:
3 left
💡 Hint
Common Mistakes
Mixing different signals in import and decorator.
Using save signals instead of delete signals.
Forgetting to import the signal.
5fill in blank
hard

Fill all three blanks to create a signal handler that listens to post_save for Profile and prints the instance's username.

Django
from django.db.models.signals import [1]
from django.dispatch import [2]

@[2]([1], sender=Profile)
def profile_saved(sender, instance, **kwargs):
    print(f"Saved profile for {instance.username}")
Drag options to blanks, or click blank then click option'
Apost_save
Breceiver
Cpre_save
Dpost_delete
Attempts:
3 left
💡 Hint
Common Mistakes
Using different decorators in import and usage.
Importing the wrong signal.
Not matching the signal in import and decorator.

Practice

(1/5)
1. What is the main purpose of connecting signal handlers in Django?
easy
A. To style HTML templates dynamically
B. To manually call functions from views
C. To create new database tables
D. To automatically run code when certain model events happen

Solution

  1. Step 1: Understand signal handlers

    Signal handlers let Django apps respond automatically to events like saving or deleting a model.
  2. Step 2: Identify the purpose

    Connecting signal handlers means running code automatically when these events happen, without manual calls.
  3. Final Answer:

    To automatically run code when certain model events happen -> Option D
  4. Quick Check:

    Signal handlers = automatic event response [OK]
Hint: Signals run code automatically on model events [OK]
Common Mistakes:
  • Thinking signals create database tables
  • Confusing signals with manual function calls
  • Assuming signals style templates
2. Which of the following is the correct way to connect a signal handler using the decorator in Django?
easy
A. @receiver(post_save, sender=MyModel) def my_handler(sender, instance, **kwargs): pass
B. @signal(post_save, sender=MyModel) def my_handler(sender, instance): pass
C. @connect(post_save, sender=MyModel) def my_handler(instance): pass
D. @listen(post_save, sender=MyModel) def my_handler(sender): pass

Solution

  1. Step 1: Recall the correct decorator

    Django uses @receiver to connect signal handlers, not @signal, @connect, or @listen.
  2. Step 2: Check function parameters

    The handler must accept sender, instance, and optionally **kwargs. @receiver(post_save, sender=MyModel) def my_handler(sender, instance, **kwargs): pass matches this.
  3. Final Answer:

    @receiver(post_save, sender=MyModel) def my_handler(sender, instance, **kwargs): pass -> Option A
  4. Quick Check:

    Use @receiver with correct params [OK]
Hint: Use @receiver decorator with sender and signal [OK]
Common Mistakes:
  • Using wrong decorator names
  • Missing sender argument
  • Incorrect handler parameters
3. Given this code snippet, what will be printed when a new Book instance is created?
from django.db.models.signals import post_save
from django.dispatch import receiver

@receiver(post_save, sender=Book)
def announce_book(sender, instance, created, **kwargs):
    if created:
        print(f"New book added: {instance.title}")

book = Book.objects.create(title='Django Basics')
medium
A. New book added:
B. New book added: Django Basics
C. No output
D. Error: missing argument

Solution

  1. Step 1: Understand the signal and handler

    The post_save signal triggers after saving a model. The handler checks if created is True, meaning a new record.
  2. Step 2: Analyze the code execution

    Creating a new Book instance sets created=True, so the print statement runs with the title.
  3. Final Answer:

    New book added: Django Basics -> Option B
  4. Quick Check:

    post_save with created=True prints title [OK]
Hint: Check 'created' flag to print on new records only [OK]
Common Mistakes:
  • Ignoring the 'created' flag
  • Assuming no output on create
  • Confusing signal arguments
4. Identify the error in this signal handler connection code:
from django.db.models.signals import post_save
from django.dispatch import receiver

@receiver(post_save)
def handler(sender, instance, **kwargs):
    print('Saved!')
medium
A. Missing sender argument in @receiver decorator
B. Handler function missing 'created' parameter
C. post_save signal is not imported correctly
D. Handler function should not have **kwargs

Solution

  1. Step 1: Check the @receiver decorator usage

    The @receiver decorator requires the signal and optionally the sender. Omitting sender means the handler listens to all senders, which is allowed but often unintended.
  2. Step 2: Identify the likely error

    Since the question asks for an error, the missing sender argument is the problem if the handler is meant for a specific model.
  3. Final Answer:

    Missing sender argument in @receiver decorator -> Option A
  4. Quick Check:

    Specify sender to target model signals [OK]
Hint: Always specify sender to avoid catching all signals [OK]
Common Mistakes:
  • Not specifying sender when needed
  • Assuming 'created' param is always required
  • Misunderstanding **kwargs usage
5. You want to run a function only when a new UserProfile is created, not when updated. Which is the best way to connect the signal handler?
hard
A. Use @receiver(post_save) without sender and ignore created flag
B. Use @receiver(pre_save, sender=UserProfile) and always run the function
C. Use @receiver(post_save, sender=UserProfile) and check if created is True inside the handler
D. Use @receiver(post_delete, sender=UserProfile) to detect creation

Solution

  1. Step 1: Identify the correct signal for creation

    post_save runs after saving, and the created flag tells if it's a new record.
  2. Step 2: Choose the best method

    Using @receiver(post_save, sender=UserProfile) and checking created inside the handler ensures the function runs only on creation.
  3. Final Answer:

    Use @receiver(post_save, sender=UserProfile) and check if created is True inside the handler -> Option C
  4. Quick Check:

    post_save + created=True = run on new only [OK]
Hint: Check 'created' flag in post_save for new records only [OK]
Common Mistakes:
  • Using pre_save which runs before saving
  • Using post_delete which runs on deletion
  • Ignoring the created flag and running always