Custom Actions in Admin
A snippet showing how to create custom actions in Django admin.
# models.py
from django.db import models
class Order(models.Model):
number = models.CharField(max_length=20, unique=True)
status = models.CharField(max_length=20, default='PENDING')
total = models.DecimalField(max_digits=10, decimal_places=2, default=0)
created_at = models.DateTimeField(auto_now_add=True)
def __str__(self):
return f"Order {self.number}"
# admin.py
from django.contrib import admin, messages
from .models import Order
@admin.action(description="Mark selected orders as SHIPPED")
def mark_as_shipped(modeladmin, request, queryset):
updated = queryset.update(status='SHIPPED')
modeladmin.message_user(request, f"{updated} order(s) marked as SHIPPED.", level=messages.SUCCESS)
@admin.action(description="Export selected to CSV")
def export_to_csv(modeladmin, request, queryset):
import csv
from django.http import HttpResponse
response = HttpResponse(content_type='text/csv')
response['Content-Disposition'] = 'attachment; filename="orders.csv"'
writer = csv.writer(response)
writer.writerow(['number', 'status', 'total', 'created_at'])
for o in queryset.only('number', 'status', 'total', 'created_at'):
writer.writerow([o.number, o.status, o.total, o.created_at.isoformat()])
return response
@admin.register(Order)
class OrderAdmin(admin.ModelAdmin):
list_display = ('number', 'status', 'total', 'created_at')
list_filter = ('status', 'created_at')
actions = [mark_as_shipped, export_to_csv]
Explanation:
-
Define functions with signature
(modeladmin, request, queryset)and decorate with@admin.action. -
Register actions on the ModelAdmin via
actions = [..., ...]or setactions = Noneto disable. -
Use
queryset.update(...)for fast bulk updates andmessage_user()to show feedback. -
Actions can return an
HttpResponse(e.g., CSV export) to trigger file downloads.
- Category Admin
- Total Views 528
- Last Modified 05 October, 2025
- Tags #admin #actions #customization #bulk
Previous snippet
Inline Models in Admin
Next snippet