Сайт администрирования

⏱ 20 мин · 🧩 заданий: 5

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

blog/admin.py:

from django.contrib import admin

from .models import Post

admin.site.register(Post)

Откройте http://127.0.0.1:8000/admin/ под суперпользователем — появился раздел «Блог» → «Посты». Django построил форму по модели: CharField — текстовое поле, TextField — многострочное, ForeignKey — выпадающий список, choices — выбор, DateTimeField — дата и время с календарём.

Обратите внимание: благодаря verbose_name в модели поля подписаны по-русски.

Настройка отображения

Заменим простую регистрацию на класс ModelAdmin:

@admin.register(Post)
class PostAdmin(admin.ModelAdmin):
    list_display = ["title", "slug", "author", "publish", "status"]
    list_filter = ["status", "created", "publish", "author"]
    search_fields = ["title", "body"]
    prepopulated_fields = {"slug": ("title",)}
    raw_id_fields = ["author"]
    date_hierarchy = "publish"
    ordering = ["status", "publish"]
    show_facets = admin.ShowFacets.ALWAYS
Опция Что делает
list_display Колонки в списке объектов
list_filter Панель фильтров справа
search_fields Строка поиска (по каким полям искать)
prepopulated_fields Автозаполнение слага из заголовка (JavaScript в форме)
raw_id_fields Поле id с поиском вместо огромного выпадающего списка
date_hierarchy Навигация по датам над списком
ordering Сортировка списка
show_facets Счётчики рядом с фильтрами (Django 5+)

Слаги и кириллица

prepopulated_fields транслитерирует кириллицу в латиницу прямо в браузере: «Привет мир» → privet-mir. А вот функция slugify() на сервере кириллицу по умолчанию просто выбрасывает — как с этим бороться, разберём в проекте «Сайт статей».

Ещё полезные возможности

Редактирование в списке

list_editable = ["status"]          # поле должно быть и в list_display
list_display_links = ["title"]      # какие колонки — ссылки на объект
list_per_page = 50

Вычисляемые колонки

@admin.register(Post)
class PostAdmin(admin.ModelAdmin):
    list_display = ["title", "author", "words"]

    @admin.display(description="Слов")
    def words(self, obj):
        return len(obj.body.split())

Действия над выделенными объектами

@admin.action(description="Опубликовать выбранные")
def make_published(modeladmin, request, queryset):
    updated = queryset.update(status=Post.Status.PUBLISHED)
    modeladmin.message_user(request, f"Опубликовано: {updated}")


@admin.register(Post)
class PostAdmin(admin.ModelAdmin):
    actions = [make_published]

Группировка полей в форме

fieldsets = [
    (None, {"fields": ["title", "slug", "author"]}),
    ("Содержимое", {"fields": ["body"]}),
    ("Публикация", {"fields": ["status", "publish"], "classes": ["collapse"]}),
]

Вложенные объекты (inlines)

Позже, когда появятся комментарии, их можно будет редактировать прямо на странице поста:

class CommentInline(admin.TabularInline):
    model = Comment
    extra = 0


class PostAdmin(admin.ModelAdmin):
    inlines = [CommentInline]

Именно так в админке этого учебного сайта к уроку прикреплены задания.

Заголовки админки

# mysite/urls.py
admin.site.site_header = "Управление блогом"
admin.site.site_title = "Блог"
admin.site.index_title = "Разделы"

Итог

  • @admin.register(Model) + ModelAdmin — регистрация и настройка.
  • list_display, list_filter, search_fields делают список удобным.
  • prepopulated_fields заполняет слаг, raw_id_fields экономит ресурсы при большом числе связанных объектов.
  • Действия, вычисляемые колонки, fieldsets и inlines — для продвинутой настройки.

Практика решено 0 из 5

Вы не вошли — ответы проверяются, но прогресс не сохранится. Войти или зарегистрироваться.
Задание 1 Написать код

Зарегистрируйте Post в админке через декоратор. В классе PostAdmin задайте list_display с полями title, slug, author, publish, status и фильтры list_filter по status, created, publish, author.

Задание 2 Написать код

Сделайте так, чтобы слаг автоматически заполнялся из заголовка при вводе. Напишите одну строку настройки PostAdmin.

Задание 3 Один вариант ответа

Зачем указывать raw_id_fields = ["author"]?

Задание 4 Несколько вариантов

Какие опции ModelAdmin существуют?

Задание 5 Ввод ответа

Какой опцией ModelAdmin добавить над списком навигацию по годам/месяцам/дням для поля publish? Напишите строку целиком.

Войдите, чтобы отмечать пройденные уроки.