Customize Admin Form Layout

A snippet showing how to customize admin form layout.

# models.py

from django.db import models

STATUS = [
    ('draft', 'Draft'),
    ('review', 'In Review'),
    ('published', 'Published'),
]

class Article(models.Model):
    title = models.CharField(max_length=200)
    slug = models.SlugField(unique=True)
    status = models.CharField(max_length=20, choices=STATUS, default='draft')
    summary = models.CharField(max_length=280, blank=True)
    content = models.TextField()
    featured = models.BooleanField(default=False)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    def __str__(self):
        return self.title
  
# admin.py

from django.contrib import admin
from .models import Article

@admin.register(Article)
class ArticleAdmin(admin.ModelAdmin):
    # Control field order for the add/change form (when not using fieldsets)
    # fields = ('title', 'slug', 'status', 'summary', 'content', 'featured')

    # Group fields into sections and add CSS classes (e.g., collapse)
    fieldsets = (
        ('Main Info', {
            'fields': ('title', 'slug', 'status')
        }),
        ('Content', {
            'fields': ('summary', 'content'),
            'description': 'Write a short summary and the full article body.'
        }),
        ('Publishing', {
            'fields': ('featured',),
            'classes': ('collapse',),   # collapsible section
        }),
        ('Timestamps', {
            'fields': ('created_at', 'updated_at'),
        }),
    )

    # Read-only and excluded fields
    readonly_fields = ('created_at', 'updated_at')
    # exclude = ('summary',)  # alternatively hide fields entirely

    # Form behavior
    save_on_top = True
    list_display = ('title', 'status', 'featured', 'created_at')
    list_filter = ('status', 'featured', 'created_at')
    search_fields = ('title', 'slug', 'summary')
  
Explanation:
  • Use fieldsets to group fields by section; each tuple is (heading, {'fields': (...)}).
  • Add 'classes': ('collapse',) for optional sections that start collapsed (e.g., advanced settings).
  • Mark system fields as readonly_fields to prevent edits, or use exclude to hide entirely.
  • Prefer fields (or fieldsets) to control order; combine with save_on_top for quick saves.
  • Category Admin
  • Total Views 1009
  • Last Modified 07 October, 2025
  • Tags #admin #form #layout #customization
Previous snippet
Custom Actions in Admin
Never miss a story on Django.wiki

Subscribe for fresh tutorials, snippets, and updates.

By subscribing you agree to our Privacy Policy.