Админка: бесплатный 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 — и получаете таблицы, фильтры, поиск и формы. Это ускоряет разработку и наполнение контентом. Но это инструмент для администраторов, а публичные страницы мы напишем сами в следующем разделе.