The Django Admin Interface provides an out-of-the-box dashboard to manage models. However, it shows only a few default fields in the list view. To make it more useful, you can customize which fields are displayed, how they are formatted, and how they are grouped.
This article explains how to:
-
Set list view fields (
list_display
) -
Show fields in detail/edit view (
fields
,fieldsets
) -
Add readonly fields
-
Use custom methods in list display
-
Tips and common mistakes
Field Display Locations in Django Admin
Django Admin allows field customization in three main areas:
Context | Field Setting | Description |
---|---|---|
List View | list_display |
Columns shown in the model list page |
Edit/Add Form | fields or fieldsets |
Fields shown when adding or editing an item |
Read-only | readonly_fields |
Fields shown but not editable |
Setting Fields in the List View with list_display
The list_display
attribute in a ModelAdmin
class controls which fields are shown in the list view.
Example
# blog/admin.py
from django.contrib import admin
from .models import Post
class PostAdmin(admin.ModelAdmin):
list_display = ('title', 'author', 'published', 'created_at')
admin.site.register(Post, PostAdmin)
You Can Also Use:
-
Foreign key fields (e.g.,
author
) -
Date/time fields
-
Boolean fields
-
Custom methods (e.g.,
def short_title(self): return ...
)
Using Custom Methods in list_display
You can define custom methods on your admin class or model and use them as columns.
class PostAdmin(admin.ModelAdmin):
list_display = ('title', 'short_content')
def short_content(self, obj):
return obj.content[:50] + '...' if len(obj.content) > 50 else obj.content
short_content.short_description = 'Preview'
Setting Fields in the Form View with fields
Use fields
to explicitly define the order and appearance of fields in the create/edit form.
class PostAdmin(admin.ModelAdmin):
fields = ('title', 'content', 'published')
Group Fields with fieldsets
Use fieldsets
for more structured and labeled sections.
class PostAdmin(admin.ModelAdmin):
fieldsets = (
('Main Info', {'fields': ('title', 'content')}),
('Publication', {'fields': ('published', 'created_at')}),
)
Set Fields as Read-Only
Use readonly_fields
to make fields visible but non-editable in the admin.
class PostAdmin(admin.ModelAdmin):
readonly_fields = ('created_at', 'updated_at')
Common use cases:
-
Auto-generated timestamps
-
Calculated values
✅ Summary of Admin Field Options
Attribute | Use Case |
---|---|
list_display |
Show fields in the object list view |
fields |
Simple form layout |
fieldsets |
Structured form layout with sections |
readonly_fields |
Display data without allowing edits |
Complete Example
models.py
from django.db import models
class Article(models.Model):
title = models.CharField(max_length=200)
body = models.TextField()
author = models.CharField(max_length=100)
published = models.BooleanField(default=False)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
admin.py
from django.contrib import admin
from .models import Article
class ArticleAdmin(admin.ModelAdmin):
list_display = ('title', 'author', 'published', 'created_at')
readonly_fields = ('created_at', 'updated_at')
fields = ('title', 'body', 'author', 'published', 'created_at', 'updated_at')
admin.site.register(Article, ArticleAdmin)
Tips
-
Use
short_description
to customize column headers for custom methods. -
list_display_links
can specify which field(s) inlist_display
are clickable. -
list_editable
allows inline editing for fields in list view (except those inlist_display_links
). -
Keep
list_display
minimal (3–5 fields) to avoid clutter.
⚠️ Common Pitfalls
Problem | Fix |
---|---|
list_display field causes error |
Ensure the field exists or method returns a value |
ForeignKey not displaying correctly | Use __str__() in the related model |
Read-only fields not updating | Remember readonly_fields only disables editing; the model must update the field programmatically |
Setting fields but not in the correct order | Use fields or fieldsets to control ordering |
Conclusion
Customizing which fields are displayed in the Django Admin improves usability, speeds up data entry, and reduces errors. By mastering list_display
, fields
, readonly_fields
, and fieldsets
, you can tailor the admin to your app’s needs with minimal effort.