📖 Scenario: You are building a Django admin interface for a bookstore. You want to customize how the Book model appears in the admin panel to make it easier for staff to manage books.
🎯 Goal: Create a Django ModelAdmin class for the Book model that customizes the admin list display and adds a search box.
📋 What You'll Learn
Create a Book model with fields title (string), author (string), and published_year (integer).
Create a BookAdmin class to customize the admin interface for Book.
In BookAdmin, set list_display to show title, author, and published_year.
Add a search_fields attribute to BookAdmin to enable searching by title and author.
Register the Book model with the BookAdmin class in the admin site.
💡 Why This Matters
🌍 Real World
Customizing the Django admin helps staff manage data easily and efficiently by showing relevant information and search options.
💼 Career
Django developers often customize the admin interface to improve usability for content managers and administrators.
Progress0 / 4 steps
1
Create the Book model
Create a Django model called Book with fields: title as models.CharField(max_length=100), author as models.CharField(max_length=100), and published_year as models.IntegerField().
Django
Hint
Use models.CharField for text fields and models.IntegerField for numbers.
2
Create the BookAdmin class
Create a class called BookAdmin that inherits from admin.ModelAdmin.
Django
Hint
Use class BookAdmin(admin.ModelAdmin): to start your admin customization.
3
Add list_display and search_fields
Inside the BookAdmin class, set list_display to ('title', 'author', 'published_year') and search_fields to ('title', 'author').
Django
Hint
Use tuples for list_display and search_fields with the exact field names.
4
Register Book with BookAdmin
Register the Book model with the admin site using admin.site.register(Book, BookAdmin).
Django
Hint
Use admin.site.register(Book, BookAdmin) to connect the model and admin class.
Practice
(1/5)
1. What is the main purpose of customizing a Django ModelAdmin class?
easy
A. To define URL routes for the model views
B. To control how a model is displayed and managed in the Django admin interface
C. To write custom SQL queries for the model
D. To create new database tables automatically
Solution
Step 1: Understand ModelAdmin role
The ModelAdmin class customizes the admin interface for a model, such as which fields show and how data is filtered.
Step 2: Identify what ModelAdmin does not do
It does not create tables, write SQL, or define URLs; those are handled elsewhere in Django.
Final Answer:
To control how a model is displayed and managed in the Django admin interface -> Option B
Quick Check:
ModelAdmin controls admin display = D [OK]
Hint: ModelAdmin customizes admin display, not database or URLs [OK]
Common Mistakes:
Confusing ModelAdmin with database migrations
Thinking ModelAdmin handles URL routing
Assuming ModelAdmin writes SQL queries
2. Which of the following is the correct way to register a model with a custom ModelAdmin in Django admin?
easy
A. admin.site.add(MyModel, MyModelAdmin)
B. admin.register(MyModel, MyModelAdmin)
C. admin.site.register(MyModel, MyModelAdmin)
D. admin.register_site(MyModel, MyModelAdmin)
Solution
Step 1: Recall Django admin registration syntax
The correct method to register a model with a custom admin class is admin.site.register(Model, ModelAdmin).
Step 2: Check other options for validity
Other options like admin.register or admin.site.add do not exist in Django's admin API.
Final Answer:
admin.site.register(MyModel, MyModelAdmin) -> Option C
Quick Check:
Use admin.site.register to register models = A [OK]
Hint: Use admin.site.register(Model, AdminClass) to register [OK]
Common Mistakes:
Using admin.register instead of admin.site.register
Trying to call admin.site.add which doesn't exist
Confusing method names for registration
3. Given this ModelAdmin code, what fields will appear in the Django admin list view?
class BookAdmin(admin.ModelAdmin):
list_display = ('title', 'author', 'published_date')
admin.site.register(Book, BookAdmin)
medium
A. 'title', 'author', and 'published_date' fields
B. Only 'title' and 'author' fields
C. All fields of the Book model
D. No fields will appear because list_display is incorrect
Solution
Step 1: Understand list_display usage
The list_display attribute defines exactly which fields show in the admin list view.
Step 2: Check the fields listed
The tuple includes 'title', 'author', and 'published_date', so these three fields will appear.
Final Answer:
'title', 'author', and 'published_date' fields -> Option A
Quick Check:
list_display shows specified fields = A [OK]
Hint: list_display shows only fields listed in its tuple [OK]
Common Mistakes:
Assuming all model fields show by default
Thinking list_display must include all fields
Believing list_display is optional for showing fields
4. What is wrong with this ModelAdmin code snippet?
class AuthorAdmin(admin.ModelAdmin):
search_fields = 'name'
admin.site.register(Author, AuthorAdmin)
medium
A. search_fields should be a list or tuple, not a string
B. AuthorAdmin must inherit from admin.ModelAdminBase
C. admin.site.register is missing parentheses
D. search_fields cannot be used in ModelAdmin
Solution
Step 1: Check search_fields type
The search_fields attribute must be a list or tuple of field names, not a single string.
Step 2: Validate other parts
Inheritance from admin.ModelAdmin is correct, registration syntax is correct, and search_fields is valid in ModelAdmin.
Final Answer:
search_fields should be a list or tuple, not a string -> Option A
Quick Check:
search_fields needs list/tuple = C [OK]
Hint: Wrap search_fields in [] or () even for one field [OK]
Common Mistakes:
Using a plain string instead of list/tuple for search_fields
Confusing ModelAdmin inheritance class
Missing parentheses in admin.site.register (not here though)
5. You want to add a filter sidebar in Django admin to filter books by their 'genre' and 'published_year'. Which ModelAdmin attribute should you customize, and how?
hard
A. Add filter_fields = ['genre', 'published_year'] in the ModelAdmin
B. Use search_fields = ('genre', 'published_year') to enable filtering
C. Override filter_sidebar = True in the ModelAdmin
D. Set list_filter = ('genre', 'published_year') in the ModelAdmin class
Solution
Step 1: Identify correct attribute for filters
The list_filter attribute adds filter sidebars for specified fields in the admin list view.
Step 2: Check other options for correctness
filter_fields and filter_sidebar do not exist; search_fields is for search, not filters.
Final Answer:
Set list_filter = ('genre', 'published_year') in the ModelAdmin class -> Option D
Quick Check:
Use list_filter for sidebar filters = B [OK]
Hint: Use list_filter tuple to add filter sidebar fields [OK]
Common Mistakes:
Using search_fields instead of list_filter for filters
Trying to use non-existent filter_fields attribute
Assuming filter_sidebar is a valid option
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.