Django Admin Panel Development
Django Admin — built-in data management system in Django. Works "out-of-the-box" for any model, requires minimal code for basic CRUD. When properly configured covers most operational business needs.
Basic Model Registration
# admin.py
from django.contrib import admin
from .models import Order, OrderItem, Customer
@admin.register(Order)
class OrderAdmin(admin.ModelAdmin):
list_display = ['id', 'customer', 'status', 'total_display', 'created_at']
list_filter = ['status', 'created_at']
search_fields = ['id', 'customer__email', 'customer__phone']
list_select_related= ['customer']
ordering = ['-created_at']
date_hierarchy = 'created_at'
readonly_fields = ['created_at', 'updated_at', 'total']
list_per_page = 50
def total_display(self, obj):
return f'₽{obj.total / 100:,.0f}'
total_display.short_description = 'Amount'
total_display.admin_order_field = 'total'
def get_queryset(self, request):
return super().get_queryset(request).prefetch_related('items__product')
Inline Editing Related Objects
class OrderItemInline(admin.TabularInline):
model = OrderItem
fields = ['product', 'quantity', 'price', 'total']
readonly_fields= ['total']
extra = 0 # don't show empty rows for adding
@admin.register(Order)
class OrderAdmin(admin.ModelAdmin):
inlines = [OrderItemInline]
Custom Actions
@admin.action(description='Mark as completed')
def mark_completed(modeladmin, request, queryset):
updated = queryset.filter(status='pending').update(
status='completed',
completed_at=timezone.now()
)
modeladmin.message_user(request, f'{updated} orders marked as completed.')
@admin.action(description='Export to Excel')
def export_excel(modeladmin, request, queryset):
# Generate Excel via openpyxl
response = HttpResponse(content_type='application/vnd.ms-excel')
response['Content-Disposition'] = 'attachment; filename=orders.xlsx'
export_orders_to_excel(queryset, response)
return response
class OrderAdmin(admin.ModelAdmin):
actions = [mark_completed, export_excel]
Custom Statistics Page
from django.contrib.admin.views.decorators import staff_member_required
from django.shortcuts import render
from django.db.models import Sum, Count
from django.db.models.functions import TruncDate
@staff_member_required
def order_statistics(request):
stats = Order.objects.filter(
status='completed',
created_at__gte=timezone.now() - timedelta(days=30)
).annotate(
date=TruncDate('created_at')
).values('date').annotate(
revenue=Sum('total'),
count=Count('id')
).order_by('date')
return render(request, 'admin/order_statistics.html', {'stats': list(stats)})
Access Control Configuration
class OrderAdmin(admin.ModelAdmin):
def has_delete_permission(self, request, obj=None):
return request.user.has_perm('orders.delete_order') and request.user.is_superuser
def has_change_permission(self, request, obj=None):
if obj and obj.status == 'completed':
return request.user.is_superuser # only superadmin can edit completed
return super().has_change_permission(request, obj)
UI Customization (django-jazzmin)
pip install django-jazzmin
# settings.py
INSTALLED_APPS = ['jazzmin', 'django.contrib.admin', ...]
JAZZMIN_SETTINGS = {
'site_title': 'My Store',
'site_header': 'Administration',
'site_brand': 'Store',
'theme': 'flatly',
'icons': {
'orders.order': 'fas fa-shopping-cart',
'auth.user': 'fas fa-user',
'catalog.product': 'fas fa-box'
}
}
django-import-export: CSV/Excel Import Export
from import_export import resources, fields
from import_export.admin import ImportExportModelAdmin
class ProductResource(resources.ModelResource):
class Meta:
model = Product
fields = ('id', 'name', 'sku', 'price', 'stock')
import_id_fields = ('sku',) # update by SKU, not ID
@admin.register(Product)
class ProductAdmin(ImportExportModelAdmin):
resource_classes = [ProductResource]
Development timeline: 2–3 weeks for full panel with custom actions, inlines, permissions, and export.







