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
Recall & Review
beginner
What is the purpose of the @receiver decorator in Django?
The @receiver decorator connects a function to a Django signal, so the function runs automatically when that signal is sent.
Click to reveal answer
beginner
How do you import the <code>@receiver</code> decorator in Django?
You import it with: <code>from django.dispatch import receiver</code>.
Click to reveal answer
intermediate
Explain the role of the signal argument in the @receiver(signal) decorator.
The signal argument tells Django which signal the decorated function should listen to and respond when that signal is sent.
Click to reveal answer
intermediate
What parameters does a receiver function typically accept?
A receiver function usually accepts sender, instance, and **kwargs to get details about the signal event.
Click to reveal answer
intermediate
Why is using the @receiver decorator better than manually connecting signals with signal.connect()?
The @receiver decorator makes the code cleaner and easier to read by linking the function directly to the signal in one place.
Click to reveal answer
What does the @receiver decorator do in Django?
ARuns a function immediately
BCreates a new signal
CDeletes a signal
DConnects a function to a signal
✗ Incorrect
The @receiver decorator connects a function to a Django signal so it runs when the signal is sent.
Which module do you import @receiver from?
Adjango.models
Bdjango.signals
Cdjango.dispatch
Ddjango.utils
✗ Incorrect
You import @receiver from django.dispatch.
What argument do you pass to the @receiver decorator?
AThe signal to listen for
BThe sender class
CThe function name
DThe model name
✗ Incorrect
You pass the signal you want the function to listen for to the @receiver decorator.
Which of these is NOT a typical parameter of a receiver function?
Arequest
Binstance
Csender
D**kwargs
✗ Incorrect
Receiver functions usually accept sender, instance, and **kwargs, but not request.
Why use the @receiver decorator instead of signal.connect()?
AIt runs the function faster
BIt makes code cleaner and easier to read
CIt disables the signal
DIt automatically deletes the function
✗ Incorrect
The @receiver decorator links the function to the signal clearly in one place, improving code readability.
Describe how the @receiver decorator works in Django and why it is useful.
Think about how Django signals notify parts of your app and how the decorator helps handle that.
You got /4 concepts.
Explain the typical parameters a receiver function accepts and what information they provide.
Consider what details the function needs to respond properly to the signal.
You got /3 concepts.
Practice
(1/5)
1. What is the main purpose of the @receiver decorator in Django?
easy
A. To register a template filter
B. To create a new database model
C. To connect a function to a signal so it runs automatically when the signal is sent
D. To define a URL route in Django
Solution
Step 1: Understand what signals do in Django
Signals notify parts of your app when something happens, like saving a model.
Step 2: Role of the @receiver decorator
The decorator links a function to a signal so it runs automatically when the signal is sent.
Final Answer:
To connect a function to a signal so it runs automatically when the signal is sent -> Option C
Quick Check:
Receiver decorator connects functions to signals = D [OK]
Hint: Receiver links functions to signals for automatic execution [OK]
Common Mistakes:
Confusing receiver with model or URL definitions
Thinking receiver creates models or templates
Mixing up signals with URL routing
2. Which of the following is the correct syntax to use the @receiver decorator for the post_save signal of a model named Book?
easy
A. @receiver(post_save, sender=Book)
def my_handler(sender, instance, **kwargs):
pass
B. @receiver(post_save(Book))
def my_handler(sender, instance, **kwargs):
pass
C. @receiver(sender=Book, post_save)
def my_handler(sender, instance, **kwargs):
pass
D. @receiver(post_save)
def my_handler(Book, instance, **kwargs):
pass
Solution
Step 1: Check the correct decorator syntax
The @receiver decorator takes the signal as first argument and sender=ModelName as keyword argument.
Step 2: Match the correct function signature
The handler function must accept sender, instance, and **kwargs.
Final Answer:
@receiver(post_save, sender=Book)
def my_handler(sender, instance, **kwargs):
pass -> Option A
Quick Check:
Correct decorator syntax = C [OK]
Hint: Use @receiver(signal, sender=Model) syntax [OK]
Common Mistakes:
Passing sender as positional argument
Incorrect function parameters
Missing sender keyword argument
3. Given this code snippet, what will be printed when a Book instance is saved?
from django.db.models.signals import post_save
from django.dispatch import receiver
@receiver(post_save, sender=Book)
def notify(sender, instance, **kwargs):
print(f"Book saved: {instance.title}")
book = Book(title='Django Basics')
book.save()
medium
A. Book saved: None
B. Error: receiver not connected
C. No output printed
D. Book saved: Django Basics
Solution
Step 1: Understand the signal connection
The @receiver decorator connects notify to post_save for Book.
Step 2: What happens on book.save()?
Saving the book triggers post_save, calling notify, which prints the book's title.
Final Answer:
Book saved: Django Basics -> Option D
Quick Check:
post_save triggers print with instance title = B [OK]
Hint: post_save calls receiver printing instance data [OK]
Common Mistakes:
Assuming no output without explicit call
Confusing instance attribute access
Thinking receiver needs manual call
4. Identify the error in this signal receiver code:
from django.db.models.signals import post_save
from django.dispatch import receiver
@receiver(post_save, sender=Author)
def handle_save(instance, **kwargs):
print(f"Author saved: {instance.name}")
medium
A. Incorrect decorator usage, should not use sender
B. Missing sender parameter in function definition
C. Function name must be post_save_handler
D. No error, code is correct
Solution
Step 1: Check function parameters for signal handlers
Signal handlers must accept sender, instance, and **kwargs.
Step 2: Identify missing parameter
The function handle_save lacks the sender parameter, causing an error.
Final Answer:
Missing sender parameter in function definition -> Option B
Quick Check:
Signal handler must have sender parameter = A [OK]
Hint: Signal handlers need sender, instance, **kwargs parameters [OK]
Common Mistakes:
Omitting sender parameter
Wrong function signature order
Assuming function name matters
5. You want to run a function only when a User model instance is created (not updated). How do you use the @receiver decorator with post_save to achieve this?
hard
A. @receiver(post_save, sender=User)
def user_created(sender, instance, created, **kwargs):
if created:
print('New user created')
B. @receiver(post_save, sender=User)
def user_created(sender, instance, **kwargs):
print('New user created')
C. @receiver(post_save, sender=User)
def user_created(sender, instance, created=False, **kwargs):
if created == False:
print('New user created')
D. @receiver(post_save, sender=User)
def user_created(sender, instance, **kwargs):
if not created:
print('New user created')
Solution
Step 1: Understand the created flag in post_save
The post_save signal passes a created boolean indicating if the instance was newly created.
Step 2: Use created to run code only on creation
Check if created: inside the receiver function to run code only when a new instance is created.
Final Answer:
@receiver(post_save, sender=User)
def user_created(sender, instance, created, **kwargs):
if created:
print('New user created') -> Option A
Quick Check:
Use created flag in post_save receiver = A [OK]
Hint: Check 'created' flag in post_save receiver to detect new instances [OK]