Django Admin is a built-in management panel for working with data through a browser.
Registering a Model
# admin.py
from django.contrib import admin
from .models import Task, Project
admin.site.register(Task)
admin.site.register(Project)
The models are now accessible at /admin/.
ModelAdmin — Display Configuration
@admin.register(Task)
class TaskAdmin(admin.ModelAdmin):
list_display = ['title', 'status', 'owner', 'created_at']
list_filter = ['status', 'priority']
search_fields = ['title', 'owner__username']
ordering = ['-created_at']
date_hierarchy = 'created_at'
list_display and list_editable
@admin.register(Task)
class TaskAdmin(admin.ModelAdmin):
list_display = ['title', 'status', 'priority']
list_editable = ['status', 'priority'] # edit directly in the list
fieldsets — Field Grouping
@admin.register(Task)
class TaskAdmin(admin.ModelAdmin):
fieldsets = [
('General', {'fields': ['title', 'description']}),
('Parameters', {'fields': ['status', 'priority', 'owner', 'project']}),
('Dates', {'fields': ['due_date'], 'classes': ['collapse']}),
]
search_fields and list_filter
search_fields — full-text search across the specified fields. Supports traversing relations (owner__username). Django adds a LIKE query for each field.
list_filter — a sidebar with filters. Works with choice fields, boolean fields, ForeignKey, and dates.
@admin.register(Task)
class TaskAdmin(admin.ModelAdmin):
search_fields = ['title', 'description', 'owner__email']
list_filter = ['status', 'priority', 'project', 'created_at']
readonly_fields
Read-only fields are shown on the edit page but don’t accept input:
@admin.register(Task)
class TaskAdmin(admin.ModelAdmin):
readonly_fields = ['created_at', 'updated_at', 'slug']
fieldsets = [
('General', {'fields': ['title', 'description']}),
('System', {'fields': ['slug', 'created_at', 'updated_at']}),
]
Useful for auto-generated fields that shouldn’t be edited manually.
Custom Actions
Actions are applied to selected objects in the list. Example — bulk status change:
@admin.action(description='Mark as completed')
def mark_done(modeladmin, request, queryset):
queryset.update(status='done')
@admin.action(description='Mark as cancelled')
def mark_cancelled(modeladmin, request, queryset):
queryset.update(status='cancelled')
@admin.register(Task)
class TaskAdmin(admin.ModelAdmin):
list_display = ['title', 'status']
actions = [mark_done, mark_cancelled]
After registration, actions appear in the dropdown above the object list. The user selects rows, chooses an action, and clicks “Go”.
save_model — Intercept Saves
save_model is called when an object is saved through Admin. Use it to add logic: set the author, send a notification, write a log:
@admin.register(Task)
class TaskAdmin(admin.ModelAdmin):
def save_model(self, request, obj, form, change):
if not change:
# New object — set the owner
obj.owner = request.user
super().save_model(request, obj, form, change)
The change parameter: False — creating a new object, True — editing an existing one.
Creating a Superuser
python manage.py createsuperuser
Then open /admin/ and log in with the credentials you created.
💬 Comments (0)
No comments yet
Be the first to share your opinion about this article!