Customizing Django Admin Like a Pro: Tips & Tricks

Django’s built-in admin panel is very powerful, by customizing Dajngo admin it can supercharge productivity and improve usability. Whether…

Customizing Django Admin Like a Pro: Tips & Tricks
Photo by Agence Olloweb on Unsplash

Django’s built-in admin panel is very powerful, by customizing Dajngo admin it can supercharge productivity and improve usability. Whether you’re building an internal tool or a full-fledged admin dashboard, these tips & tricks will help you level up your Django Admin skills.


1. Customize the Admin Dashboard Layout

By default, Django Admin lists models in alphabetical order. You can override this and customize the layout.

Create a custom admin index page:

# admin.py 
from django.utils.translation import gettext_lazy as _ 
from django.contrib.admin import AdminSite 
from .models import Product, User 
 
# Create custom admin site by overriding AdminSite 
class CustomAdminSite(AdminSite): 
    site_header = "My Custom Admin" 
    site_title = "Admin Panel" 
    index_title = "Welcome to My Dashboard" 
 
admin_site = CustomAdminSite(name="custom_admin") 
 
# Now you use admin_site to register your model 
admin_site.register(User) 
admin_site.register(Product)

2. Customize List Display with Admin Fields

The default Django Admin list view shows only the __str__ representation of a model. You can add more fields, sorting, and filtering.

Example: Show additional columns in list view

# admin.py 
from django.contrib import admin 
from .models import Product 
 
@admin.register(Product) 
class ProductAdmin(admin.ModelAdmin): 
    list_display = ('name', 'price', 'stock', 'category', 'updated_at') # display these fields in the admin list view 
    list_filter = ('category', 'created_at') # filter based on these fields 
    search_fields = ('name', 'description') # search based on these fields 
    ordering = ('-updated_at',) # ordering the list

This makes searching and filtering more efficient.

Instead of switching between models, you can edit related objects directly in the admin panel.

Example: Edit product variants inside the Product admin page

# admin.py 
from django.contrib import admin 
from .models import Product, Variant 
 
class VariantInline(admin.TabularInline):  # or use StackedInline 
    model = Variant 
    extra = 1  # Number of empty forms shown for new objects 
 
@admin.register(Product) 
class ProductAdmin(admin.ModelAdmin): 
    inlines = [VariantInline]

Use TabularInline for a compact table format and StackedInline for a stacked form view.

4. Override Form Widgets for Better UI

By default, Django Admin uses basic input fields. You can improve the UI with better widgets.

Example: Use a rich text editor for a description field

# forms.py 
from django import forms 
from .models import BlogPost 
from ckeditor.widgets import CKEditorWidget  # Install django-ckeditor 
 
class BlogPostAdminForm(forms.ModelForm): 
    content = forms.CharField(widget=CKEditorWidget()) 
 
    class Meta: 
        model = BlogPost 
        fields = '__all__' 
 
# admin.py 
from .forms import BlogPostAdminForm 
from django.contrib import admin 
from .models import BlogPost 
 
@admin.register(BlogPost) 
class BlogPostAdmin(admin.ModelAdmin): 
    form = BlogPostAdminForm

This improves usability for fields like descriptions, policies, or documentation.

5. Add Custom Actions for Bulk Updates

You can add custom bulk actions to save time when managing large datasets.

Example: Mark multiple orders as shipped

# admin.py 
from django.contrib import admin 
 
def mark_as_shipped(modeladmin, request, queryset): 
    queryset.update(status='shipped') 
mark_as_shipped.short_description = "Mark selected orders as shipped" 
 
@admin.register(Order) 
class OrderAdmin(admin.ModelAdmin): 
    list_display = ('customer', 'product', 'status', 'created_at') 
    actions = [mark_as_shipped]

This will add an additional action that will perform bulk updates with just a few clicks by updating status maked as “shipped”.

6. Customize Admin Templates for a Unique Look

Django Admin’s default UI is functional but not always visually appealing. You can override templates to change the design.

Example: Customize the base template

  1. Create a new directory:
templates 
  - admin 
    - base_site.html

2. Customize the file:

{% extends "admin/base.html" %} 
{% block branding %} 
<h1>🚀 My Custom Admin Panel</h1> 
{% endblock %}

You can also change CSS styles by overriding admin/base.html.

7. Use Django Suit or Jazzmin for a Better UI

If you want an entirely new UI, consider using Django Suit or Jazzmin.

Install Jazzmin for a modern admin theme:

pip install django-jazzmin

Add "jazzmin" to INSTALLED_APPS, and it will automatically style your admin panel.

# settings.py 
INSTALLED_APPS = [ 
  "jazzmin", 
  "django.contrib.admin", 
]

8. Optimize Performance with List-Only Fields

If you have thousands of records, loading all fields can be slow. Use list_select_related and list_prefetch_related to optimize performance.

Example: Optimize queries in Admin

# admin.py 
from django.contrib import admin 
from .models import Order 
 
@admin.register(Order) 
class OrderAdmin(admin.ModelAdmin): 
    list_display = ('customer', 'product', 'status') 
    list_select_related = ('customer', 'product')  # Reduces database queries

9. Add Read-Only Fields for Audit Logs

You may want some fields visible but not editable.

Example: Make created_at and last_login read-only

# admin.py 
from django.contrib import admin 
from .models import User 
 
@admin.register(User) 
class UserAdmin(admin.ModelAdmin): 
    readonly_fields = ('created_at', 'last_login') # Make read-only fields

This ensures that critical fields are protected from accidental edits.

Final Thoughts

Django Admin is powerful out of the box, but with these customizations, you can enhance usability, improve performance, and create a better experience for admins.

Which Django Admin trick is your favorite? Let me know in the comments! 🚀