Админка: бесплатный CRUD из коробки

Админка Django — бесплатная панель управления данными «из коробки». Несколько строк регистрации — и у вас полноценный CRUD-интерфейс для любой модели.
Суть: django.contrib.admin даёт готовый веб-интерфейс для просмотра, создания, редактирования и удаления записей. Настраивается классом ModelAdmin.

Зачем нужна админка

Это одна из «киллер-фич» Django, которой нет у большинства фреймворков. Как только у вас есть модель, Django может автоматически построить интерфейс для управления её данными: таблица записей, формы создания и редактирования, фильтры, поиск. Это бесценно на ранних этапах: контент-менеджеры наполняют сайт, а вы ещё не написали ни одной публичной страницы.

Регистрация модели

Сначала создаём суперпользователя, затем регистрируем модель в admin.py:

python manage.py createsuperuser
from django.contrib import admin
from .models import Post

@admin.register(Post)
class PostAdmin(admin.ModelAdmin):
    list_display = ("title", "author", "created_at", "is_published")
    list_filter = ("is_published", "created_at")
    search_fields = ("title", "body")
    list_editable = ("is_published",)
    prepopulated_fields = {"slug": ("title",)}

Зайдите на /admin/, войдите под суперпользователем — и увидите полноценную панель.

Главные опции ModelAdmin

Класс ModelAdmin настраивает поведение. list_display — какие столбцы показывать в таблице. list_filter — боковая панель фильтров. search_fields — по каким полям искать. list_editable — поля, редактируемые прямо в списке. prepopulated_fields — автозаполнение (например, slug из title). readonly_fields — поля только для чтения.

Как это работает под капотом

Админка — это, по сути, генератор таблицы и форм по описанию модели. Логика list_filter и search_fields языко-независима: это фильтрация набора записей по разным критериям. Вот демонстрация того, что делает админка при поиске и фильтрации:

# Попробуй сам ▶ — поиск и фильтр как в админке
posts = [
    {"title": "Django ORM",     "published": True,  "author": "Анна"},
    {"title": "Шаблоны DTL",    "published": False, "author": "Борис"},
    {"title": "Формы и ORM",    "published": True,  "author": "Анна"},
    {"title": "Деплой Django",  "published": True,  "author": "Борис"},
]

def admin_view(rows, search="", list_filter=None):
    result = rows
    # search_fields = ("title",)
    if search:
        result = [r for r in result if search.lower() in r["title"].lower()]
    # list_filter = ("published", "author")
    if list_filter:
        for field, value in list_filter.items():
            result = [r for r in result if r[field] == value]
    return result

print("Поиск 'ORM':")
for r in admin_view(posts, search="ORM"):
    print("  ", r["title"])

print("Фильтр published=True, author=Анна:")
for r in admin_view(posts, list_filter={"published": True, "author": "Анна"}):
    print("  ", r["title"])

Inline-редактирование связей

Для связанных моделей админка поддерживает inline-формы: например, редактировать комментарии прямо на странице поста. Это делается через TabularInline или StackedInline и подключается в inlines родительского ModelAdmin.

Действия над выборкой и кастомизация

Админка умеет выполнять массовые действия над выбранными строками. По умолчанию доступно удаление, но вы легко добавляете свои: например, «опубликовать выбранные» или «снять с публикации». Действие — это обычная функция, принимающая QuerySet выбранных объектов, плюс декоратор @admin.action с человекочитаемым описанием. Это превращает админку в полноценную панель управления контентом без единой строки фронтенда. Помимо действий, через ModelAdmin настраивают группировку полей формы (fieldsets), автодополнение для связей (autocomplete_fields, спасает на больших таблицах), фильтрацию по датам (date_hierarchy) и вычисляемые столбцы — методы, возвращающие готовый текст для отображения в списке. Всё это делает встроенную админку удивительно гибкой для внутренних инструментов.

Частые ошибки

  • Забыть зарегистрировать модель. Без admin.register или admin.site.register её не будет в панели.
  • Считать админку публичным интерфейсом. Она для администраторов, а не для конечных пользователей.
  • Не настроить list_display. Тогда в списке только __str__, неудобно.
  • Открывать /admin/ наружу без защиты. На проде её часто прячут за VPN или меняют URL.

Best practices

  • Настройте list_display, list_filter и search_fields для каждой важной модели.
  • Используйте @admin.register вместо отдельного вызова register — компактнее.
  • Прячьте админку на проде: нестандартный URL, ограничение по IP, двухфакторная аутентификация.
  • Помните: админка — для своих, для пользователей пишите отдельные views.

Итоги

Админка — мощный бесплатный CRUD-интерфейс. Регистрируете модель, настраиваете ModelAdmin — и получаете таблицы, фильтры, поиск и формы. Это ускоряет разработку и наполнение контентом. Но это инструмент для администраторов, а публичные страницы мы напишем сами в следующем разделе.

Проверьте себя
1. Что нужно сделать, чтобы модель появилась в админке?
AНичего, появляется автоматически
BЗарегистрировать её через admin.register/admin.site.register
CСоздать для неё отдельную базу
DПрописать в urls.py
2. За что отвечает опция list_display в ModelAdmin?
AЗа права доступа
BЗа то, какие столбцы показывать в таблице списка записей
CЗа шифрование данных
DЗа порядок миграций