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
Connecting signal handlers in Django
📖 Scenario: You are building a Django app that needs to perform an action automatically whenever a new user is created. Django signals let you run code in response to certain events, like saving a model.
🎯 Goal: Learn how to connect a signal handler function to Django's post_save signal for the User model. This handler will print a message when a new user is created.
📋 What You'll Learn
Create a signal handler function named welcome_new_user that accepts sender, instance, created, and **kwargs parameters.
Connect the welcome_new_user function to Django's post_save signal for the User model.
Ensure the handler only runs when a new user is created (not updated).
Import all necessary modules and models correctly.
💡 Why This Matters
🌍 Real World
Automatically running code when users sign up helps send welcome messages, set up profiles, or log activity without manual steps.
💼 Career
Understanding Django signals is important for backend developers to create clean, event-driven code that reacts to database changes.
Progress0 / 4 steps
1
Import User model and post_save signal
Write import statements to import User from django.contrib.auth.models and post_save from django.db.models.signals.
Django
Hint
Use from django.contrib.auth.models import User and from django.db.models.signals import post_save.
2
Define the signal handler function
Define a function named welcome_new_user that takes parameters sender, instance, created, and **kwargs. Inside the function, add an if statement to check if created is True. If so, write a comment inside the block saying # New user created.
Django
Hint
Define the function with the exact name and parameters. Use if created: to check if the user is new.
3
Connect the signal handler to post_save for User
Use post_save.connect to connect the welcome_new_user function to the post_save signal for the User model. Pass sender=User as an argument.
Django
Hint
Use post_save.connect(welcome_new_user, sender=User) to connect the handler.
4
Add a print statement inside the handler
Inside the if created: block of welcome_new_user, add a print statement that outputs Welcome, {instance.username}! using an f-string.
Django
Hint
Use print(f"Welcome, {instance.username}!") inside the if created: block.
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
Step 1: Understand signal handlers
Signal handlers let Django apps respond automatically to events like saving or deleting a model.
Step 2: Identify the purpose
Connecting signal handlers means running code automatically when these events happen, without manual calls.
Final Answer:
To automatically run code when certain model events happen -> Option D
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
Step 1: Recall the correct decorator
Django uses @receiver to connect signal handlers, not @signal, @connect, or @listen.
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.
Final Answer:
@receiver(post_save, sender=MyModel)
def my_handler(sender, instance, **kwargs): pass -> Option A
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
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.
Step 2: Analyze the code execution
Creating a new Book instance sets created=True, so the print statement runs with the title.
Final Answer:
New book added: Django Basics -> Option B
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
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.
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.
Final Answer:
Missing sender argument in @receiver decorator -> Option A
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
Step 1: Identify the correct signal for creation
post_save runs after saving, and the created flag tells if it's a new record.
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.
Final Answer:
Use @receiver(post_save, sender=UserProfile) and check if created is True inside the handler -> Option C
Quick Check:
post_save + created=True = run on new only [OK]
Hint: Check 'created' flag in post_save for new records only [OK]