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
Filtering with django-filter
📖 Scenario: You are building a simple web app to display a list of books. Users want to filter books by their genre.
🎯 Goal: Create a Django view that uses django-filter to filter books by genre and display the filtered list.
📋 What You'll Learn
Create a Django model called Book with fields title and genre
Create a filter class called BookFilter using django_filters.FilterSet to filter by genre
Create a view called book_list that applies BookFilter to the Book queryset
Render the filtered books in a template
💡 Why This Matters
🌍 Real World
Filtering data is common in web apps to help users find what they want quickly, like filtering products by category.
💼 Career
Knowing django-filter helps you build user-friendly Django apps that handle data filtering efficiently, a valuable skill for backend and full-stack developers.
Progress0 / 4 steps
1
Create the Book model
Create a Django model called Book with two fields: title as CharField with max length 100, and genre as CharField with max length 50.
Django
Hint
Use models.CharField for both fields with the specified max lengths.
2
Create the BookFilter class
Create a filter class called BookFilter that inherits from django_filters.FilterSet. Inside, create a Meta class that sets model = Book and fields = ['genre'].
Django
Hint
Import django_filters and create a class that inherits from django_filters.FilterSet.
3
Create the book_list view
Create a Django view function called book_list that takes request as a parameter. Inside, create a BookFilter instance called book_filter using request.GET and Book.objects.all(). Then get the filtered queryset as books = book_filter.qs.
Django
Hint
Import render from django.shortcuts. Use BookFilter(request.GET, queryset=Book.objects.all()) to filter.
4
Add the filter form to the template
In the template book_list.html, add the filter form by including {{ filter.form.as_p }} inside a <form> with method get. Below the form, loop over books and display each book's title and genre inside <li> tags.
Django
Hint
Use a <form method="get"> with {{ filter.form.as_p }} and a submit button. Loop over books with {% for book in books %}.
Practice
(1/5)
1. What is the main purpose of using django-filter in a Django project?
easy
A. To create database tables automatically
B. To easily filter querysets based on user input without writing complex code
C. To handle user authentication and permissions
D. To generate HTML forms for user registration
Solution
Step 1: Understand django-filter's role
django-filter is designed to simplify filtering data in Django apps by creating filters for querysets.
Step 2: Compare with other options
Options A, C, and D relate to database creation, authentication, and form generation, which are not the main purpose of django-filter.
Final Answer:
To easily filter querysets based on user input without writing complex code -> Option B
Confusing django-filter with authentication libraries
Thinking it creates database tables
Assuming it generates forms for registration
2. Which of the following is the correct way to define a FilterSet class for a model named Book with a filter on the author field?
easy
A. class BookFilter(FilterSet):\n class Meta:\n model = Book\n fields = ['author']
B. class BookFilter(FilterSet):\n model = Book\n fields = ['author']
C. class BookFilter(FilterSet):\n class Meta:\n fields = ['author']
D. class BookFilter(FilterSet):\n class Meta:\n model = Book\n filter_fields = ['author']
Solution
Step 1: Recall FilterSet Meta class structure
The Meta class must specify the model and the fields list for filtering.
Step 2: Check each option
class BookFilter(FilterSet):\n class Meta:\n model = Book\n fields = ['author'] correctly defines Meta with model and fields. class BookFilter(FilterSet):\n model = Book\n fields = ['author'] misses Meta class. class BookFilter(FilterSet):\n class Meta:\n fields = ['author'] misses model. class BookFilter(FilterSet):\n class Meta:\n model = Book\n filter_fields = ['author'] uses incorrect attribute 'filter_fields'.
Final Answer:
class BookFilter(FilterSet):\n class Meta:\n model = Book\n fields = ['author'] -> Option A
Quick Check:
FilterSet Meta needs model and fields [OK]
Hint: FilterSet Meta needs model and fields list [OK]
Common Mistakes:
Omitting the Meta class
Using 'filter_fields' instead of 'fields'
Not specifying the model in Meta
3. Given the following FilterSet and queryset, what will be the result of filtering with author='Alice'?
class BookFilter(FilterSet):
class Meta:
model = Book
fields = ['author']
books = Book.objects.all()
filtered_books = BookFilter({'author': 'Alice'}, queryset=books).qs
medium
A. A queryset containing only books where the author field is 'Alice'
B. A queryset containing all books regardless of author
C. An empty queryset because 'author' is not a valid filter
D. A syntax error due to incorrect FilterSet usage
Solution
Step 1: Understand FilterSet filtering
Providing {'author': 'Alice'} filters the queryset to only include books with author 'Alice'.
Step 2: Confirm no errors in code
The FilterSet is correctly defined and used, so no syntax or runtime errors occur.
Final Answer:
A queryset containing only books where the author field is 'Alice' -> Option A
Quick Check:
FilterSet filters queryset by given field values [OK]
Hint: FilterSet with dict filters queryset by those values [OK]
Common Mistakes:
Assuming it returns all books without filtering
Thinking 'author' is invalid filter
Confusing FilterSet with form validation errors
4. Identify the error in this FilterSet usage:
class BookFilter(FilterSet):
class Meta:
model = Book
fields = ['title']
filter = BookFilter(request.GET)
filtered_books = filter.qs
medium
A. FilterSet class must inherit from django.forms.Form
B. Incorrect attribute name; should be filter.queryset instead of filter.qs
C. Fields list should include 'author' not 'title'
D. Missing queryset argument when creating BookFilter instance
Solution
Step 1: Check FilterSet instantiation
BookFilter requires a queryset argument to filter; it's missing here.
Step 2: Verify attribute usage
Using filter.qs is correct to get filtered queryset; no error there.
Final Answer:
Missing queryset argument when creating BookFilter instance -> Option D
Quick Check:
FilterSet needs queryset argument [OK]
Hint: Always pass queryset when instantiating FilterSet [OK]
Common Mistakes:
Forgetting to pass queryset argument
Using wrong attribute like filter.queryset
Confusing FilterSet with Django forms inheritance
5. You want to filter a list of Product objects by price range using django-filter. Which FilterSet definition correctly allows filtering products with price greater than or equal to a minimum and less than or equal to a maximum?
hard
A. class ProductFilter(FilterSet):
price = RangeFilter()
class Meta:
model = Product
fields = ['price']
B. class ProductFilter(FilterSet):
class Meta:
model = Product
fields = ['price__gte', 'price__lte']
C. class ProductFilter(FilterSet):
price_min = NumberFilter(lookup_expr='gte')
price_max = NumberFilter(lookup_expr='lte')
class Meta:
model = Product
fields = ['price_min', 'price_max']
D. class ProductFilter(FilterSet):
price_min = RangeFilter(field_name='price', lookup_expr='gte')
price_max = RangeFilter(field_name='price', lookup_expr='lte')
class Meta:
model = Product
fields = ['price_min', 'price_max']
Solution
Step 1: Understand django-filter range filters
RangeFilter allows filtering between min and max values on a single field.
Step 2: Evaluate options
class ProductFilter(FilterSet):
price = RangeFilter()
class Meta:
model = Product
fields = ['price'] uses RangeFilter but it filters a range with a single field; however, RangeFilter does not split into min and max filters automatically. class ProductFilter(FilterSet):
class Meta:
model = Product
fields = ['price__gte', 'price__lte'] uses invalid field names with double underscores in fields list, which is incorrect. class ProductFilter(FilterSet):
price_min = NumberFilter(lookup_expr='gte')
price_max = NumberFilter(lookup_expr='lte')
class Meta:
model = Product
fields = ['price_min', 'price_max'] defines two NumberFilters with lookup expressions 'gte' and 'lte' on the same field 'price' and includes them correctly in fields list; this is the correct approach. class ProductFilter(FilterSet):
price_min = RangeFilter(field_name='price', lookup_expr='gte')
price_max = RangeFilter(field_name='price', lookup_expr='lte')
class Meta:
model = Product
fields = ['price_min', 'price_max'] incorrectly uses RangeFilter twice with lookup_expr, which is not supported.
Final Answer:
class ProductFilter(FilterSet):
price_min = NumberFilter(lookup_expr='gte')
price_max = NumberFilter(lookup_expr='lte')
class Meta:
model = Product
fields = ['price_min', 'price_max'] -> Option C
Quick Check:
Use NumberFilter with lookup_expr for min and max filtering [OK]
Hint: Use NumberFilter with lookup_expr for min and max [OK]
Common Mistakes:
Using NumberFilter but listing wrong fields
Trying to use RangeFilter with lookup_expr
Specifying field names with double underscores in fields list