Django
Beginner
1 min read
Customising the Admin Site and Overriding Templates
Example
# blog/admin.py — site customisation and per-user queryset filtering
from django.contrib import admin
from .models import Post
# --- Branding ---
admin.site.site_header = 'My Blog Administration'
admin.site.site_title = 'My Blog Admin'
admin.site.index_title = 'Dashboard'
@admin.register(Post)
class PostAdmin(admin.ModelAdmin):
list_display = ['title', 'author', 'status', 'published_at']
def get_queryset(self, request):
"""Non-superusers only see their own posts."""
qs = super().get_queryset(request)
if request.user.is_superuser:
return qs
return qs.filter(author=request.user)
def save_model(self, request, obj, form, change):
"""Auto-assign author on create."""
if not change:
obj.author = request.user
super().save_model(request, obj, form, change)
def has_change_permission(self, request, obj=None):
if obj is not None and not request.user.is_superuser:
return obj.author == request.user
return super().has_change_permission(request, obj)
def has_delete_permission(self, request, obj=None):
if obj is not None and not request.user.is_superuser:
return obj.author == request.user
return super().has_delete_permission(request, obj)
# templates/admin/base_site.html — override header
# {% extends "admin/base.html" %}
# {% block branding %}
# <h1 id="site-name"><a href="{% url 'admin:index' %}">My Blog Admin</a></h1>
# {% endblock %}
Related Resources
Django Reference
Complete tag & property list
Django How-To Guides
Step-by-step practical guides
Django Exercises
Practice what you've learned
More in Django