Сайт администрирования
Регистрация модели
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
Зарегистрируйте Post в админке через декоратор. В классе PostAdmin задайте
list_display с полями title, slug, author, publish, status
и фильтры list_filter по status, created, publish, author.
from django.contrib import admin
from .models import Post
@admin.register(Post)
class PostAdmin(admin.ModelAdmin):
list_display = ["title", "slug", "author", "publish", "status"]
list_filter = ["status", "created", "publish", "author"]
Сделайте так, чтобы слаг автоматически заполнялся из заголовка при вводе. Напишите одну строку настройки PostAdmin.
prepopulated_fields = {"slug": ("title",)}
Зачем указывать raw_id_fields = ["author"]?
Какие опции ModelAdmin существуют?
Какой опцией ModelAdmin добавить над списком навигацию по годам/месяцам/дням для поля publish? Напишите строку целиком.
date_hierarchy = "publish"Войдите, чтобы отмечать пройденные уроки.