Розробка административної панелі на Django Admin
Django Admin — вбудована система управління даними в Django. Працює "з коробки" для будь-якої моделі, вимагає мінімального коду для базового CRUD. При правильній настройці закриває більшість операційних потреб бізнесу.
Базова реєстрація моделі
# 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 = 'Сума'
total_display.admin_order_field = 'total'
def get_queryset(self, request):
return super().get_queryset(request).prefetch_related('items__product')
Inline-редактування пов'язаних об'єктів
class OrderItemInline(admin.TabularInline):
model = OrderItem
fields = ['product', 'quantity', 'price', 'total']
readonly_fields= ['total']
extra = 0 # не показувати пусті рядки для додавання
@admin.register(Order)
class OrderAdmin(admin.ModelAdmin):
inlines = [OrderItemInline]
Кастомні екшени
@admin.action(description='Відмітити як виконані')
def mark_completed(modeladmin, request, queryset):
updated = queryset.filter(status='pending').update(
status='completed',
completed_at=timezone.now()
)
modeladmin.message_user(request, f'{updated} замовлень відмічено як виконаних.')
@admin.action(description='Експорт в Excel')
def export_excel(modeladmin, request, queryset):
# Генерація Excel через 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]
Кастомна сторінка статистики
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)})
Настройка прав доступу
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 # тільки суперадмін може редагувати завершені
return super().has_change_permission(request, obj)
Кастомізація інтерфейсу (django-jazzmin)
pip install django-jazzmin
# settings.py
INSTALLED_APPS = ['jazzmin', 'django.contrib.admin', ...]
JAZZMIN_SETTINGS = {
'site_title': 'Мій Магазин',
'site_header': 'Адміністрування',
'site_brand': 'Магазин',
'theme': 'flatly',
'icons': {
'orders.order': 'fas fa-shopping-cart',
'auth.user': 'fas fa-user',
'catalog.product': 'fas fa-box'
}
}
django-import-export: імпорт/експорт CSV/Excel
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',) # оновлювати по SKU, не по ID
@admin.register(Product)
class ProductAdmin(ImportExportModelAdmin):
resource_classes = [ProductResource]
Срок розробки: 2–3 тижні для повнофункціональної панелі з кастомними екшенами, інлайнами, правами та експортом.







