Админку Django недооценивают: как превратить её в настоящий бэк-офис
Для внутренних инструментов я редко начинаю с собственной панели. Правильно настроенная админка Django даёт рабочий бэк-офис за полдня, и вот до какого предела я её довожу, прежде чем взяться за что-то другое.
Когда проекту нужен внутренний бэк-офис, то есть место, где сотрудники смотрят записи, правят данные и изредка выполняют массовые действия, мой первый шаг почти никогда не собственная панель. Это админка Django. Её принято считать временными лесами для разработчиков, но при нормальной настройке это полноценный инструмент, и стоит он полдня, а не спринта.
Из коробки вы регистрируете модель и получаете CRUD. Это скучная часть. Ценность начинается с ModelAdmin, где несколько строк превращают сырую таблицу в то, чем действительно может пользоваться не разработчик.
@admin.register(Order)
class OrderAdmin(admin.ModelAdmin):
list_display = ("id", "customer", "status", "total", "created_at")
list_filter = ("status", "created_at")
search_fields = ("customer__name", "customer__email")
readonly_fields = ("created_at", "total")
date_hierarchy = "created_at"
Эта горстка атрибутов даёт вам читаемую таблицу, боковую панель фильтров, работающий поиск по связанным полям и детализацию по датам. Ни фронтенда, ни запросов, написанных руками. Для большинства внутренних задач это уже весь продукт.
Следующая ступень это inline, которые решают то, что собственные панели обычно делают неправильно: редактирование записи вместе с её дочерними элементами. Заказ и его строки на одной странице, сохраняются в одной транзакции.
class OrderItemInline(admin.TabularInline):
model = OrderItem
extra = 0
class OrderAdmin(admin.ModelAdmin):
inlines = [OrderItemInline]
Когда сотрудникам нужно сделать что-то сразу со многими строками, например отметить пятьдесят заказов отгруженными, собственные действия лучше выгрузки в таблицу и обратно. Они появляются в выпадающем списке над таблицей и работают с выделенными строками.
@admin.action(description="Mark selected as shipped")
def mark_shipped(modeladmin, request, queryset):
queryset.update(status="shipped")
Две настройки важнее всех косметических. Первая это бизнес-логика при сохранении: переопределив save_model, вы заставляете админку выполнять те же правила, что и приложение, поэтому правка здесь не может тихо нарушить инвариант. Вторая это ограничение доступа, ведь не каждый сотрудник должен видеть всё. Переопределение get_queryset фильтрует строки, которые пользователь вообще может загрузить, поэтому права соблюдаются на уровне базы, а не остаются надеждой в шаблоне.
Я знаю и где здесь потолок. Как только процесс перестаёт выглядеть как «правка строк в таблицах», то есть появляются дашборды с графиками, многошаговые сценарии или что-то обращённое к клиенту, админка становится неподходящим инструментом, и я делаю настоящий интерфейс. Но эта точка наступает намного позже, чем принято думать. Значительная часть запросов «нам нужна админка» полностью закрывается той, которую Django отдаёт бесплатно, если вы готовы её действительно настроить.