patternpythondjangoTip
Django admin customization — list_display, actions, and inlines
Viewed 0 times
Django 3.2+
Django adminModelAdminlist_displayinlineadmin actioncustomization
Problem
Default Django admin shows all fields in a generic list with no custom actions or related object editing. Large datasets and complex models require tailored admin interfaces.
Solution
Customize ModelAdmin with list_display, list_filter, search_fields, and inline classes. Add custom actions for bulk operations.
from django.contrib import admin
from .models import Order, OrderItem
class OrderItemInline(admin.TabularInline):
model = OrderItem
extra = 0
readonly_fields = ['price_at_purchase']
@admin.register(Order)
class OrderAdmin(admin.ModelAdmin):
list_display = ['id', 'customer', 'status', 'total', 'created_at']
list_filter = ['status', 'created_at']
search_fields = ['customer__email', 'id']
readonly_fields = ['created_at', 'updated_at']
inlines = [OrderItemInline]
actions = ['mark_as_shipped']
@admin.action(description='Mark selected orders as shipped')
def mark_as_shipped(self, request, queryset):
updated = queryset.update(status='shipped')
self.message_user(request, f'{updated} orders marked as shipped')Why
Django admin is an auto-generated CRUD interface built from ModelAdmin metadata. list_display controls column rendering, list_filter adds sidebar filters, search_fields generates icontains queries, and inlines render related objects on the same page.
Gotchas
- list_display with a ForeignKey field traversal (author__name) triggers N+1 — use list_select_related = True
- Custom display methods must set short_description attribute for column headers
- admin.site.register() and @admin.register() are equivalent — don't use both for the same model
- readonly_fields doesn't prevent DB changes via the API — it only affects the admin UI
Context
Django projects that use the built-in admin for content management or internal tooling
Revisions (0)
No revisions yet.