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 set actions = None to disable.
  • Use queryset.update(...) for fast bulk updates and message_user() to show feedback.
  • Actions can return an HttpResponse (e.g., CSV export) to trigger file downloads.
  • Category Admin
  • Total Views 530
  • Last Modified 05 October, 2025
  • Tags #admin #actions #customization #bulk
Previous snippet
Inline Models in Admin
Never miss a story on Django.wiki

Subscribe for fresh tutorials, snippets, and updates.

By subscribing you agree to our Privacy Policy.