python / intermediate
Snippet
Django Admin Customization with ModelAdmin Methods
Django's admin interface can be extensively customized through the ModelAdmin class. Override get_queryset to filter visible objects based on user permissions. Override save_model to automatically set fields like created_by on new objects. Use list_display for custom columns, list_filter for sidebar filters, and search_fields for global search. This customization makes the admin both secure and user-friendly for content managers.
snippet.py
1
from django.contrib import admin\nfrom .models import Article, Author\n\n@admin.register(Article)\nclass ArticleAdmin(admin.ModelAdmin):\n list_display = ('title', 'author', 'status', 'published_date', 'view_count')\n list_filter = ('status', 'published_date', 'author')\n search_fields = ('title', 'content')\n prepopulated_fields = {'slug': ('title',)}\n autocomplete_fields = ['author']\n\n def get_queryset(self, request):\n qs = super().get_queryset(request)\n if request.user.is_superuser:\n return qs\n return qs.filter(author=request.user)\n\n def save_model(self, request, obj, form, change):\n if not change:\n obj.created_by = request.user\n super().save_model(request, obj, form, change)\n\n def view_count(self, obj):\n return f"{obj.views:,} views"\n view_count.short_description = 'Popularity'
django
Breakdown
1
def get_queryset(self, request):
Override to filter queryset based on user permissions
2
return qs.filter(author=request.user)
Non-superusers only see their own articles
3
def save_model(self, request, obj, form, change):
Override to add logic when saving a model instance
4
def view_count(self, obj):
Custom method to display computed field in list view
5
view_count.short_description = 'Popularity'
Set human-readable column header for custom method