Регистрация модели Post в админке
Добавим в админку интерфейс для приложения Posts, чтобы администратор сайта получил возможность управлять публикациями.
Модели не добавляются в интерфейс админки автоматически, ведь не все они нужны администратору. По умолчанию в проекте уже есть множество моделей; вы видели, что в результате миграции в базу данных добавилось много таблиц. Но в интерфейсе админки видны только две модели: Groups и Users. Остальные модели — служебные. Они не требуют внимания администратора и потому исключены из интерфейса.
Чтобы добавить модель Post в интерфейс администратора, её надо зарегистрировать в файле posts/admin.py.
Пока что файл posts/admin.py пуст:
Скопировать кодPYTHON
from django.contrib import admin
Добавьте в него такой код:
Скопировать кодPYTHON
from django.contrib import admin
from .models import Post
admin.site.register(Post)
Сохраните файл, перезагрузите страницу админки — и вы увидите новый раздел:
Все модели, зарегистрированные в admin.py определённого приложения, в админке будут отображаться в разделе этого приложения (при этом сама модель этому приложению может не принадлежать). Например, если зарегистрировать модель Post в admin.py приложения auth — подраздел Posts «переедет» в раздел Authentication and authorization.
Перейдите в раздел Posts: там подготовлено место для списка постов и есть кнопка для создания новой публикации. При нажатии откроется форма для создания поста.
Создайте новый пост. Пишите, что хотите; в нашем примере всего два слова: «Буду краток».
С точки зрения разработчика создание нового поста — это создание нового объекта (экземпляра класса) Post. Но класс Post — это модель, так что свойства, переданные в экземпляр этого класса, станут строчками в таблице БД, связанной с моделью.
Поле «Автор» обязательно для заполнения. Если не указать автора, то система выдаст сообщение об ошибке. Но если сделать всё правильно, вы создадите на сайте новую запись:
В перечне публикаций строка Post object(1) выглядит некрасиво и неинформативно. Если таких записей будут десятки, то разобраться в постах будет невозможно. Сейчас мы настроим отображение списка получше.
Конфигурация модели в admin.py
Для настройки отображения модели в интерфейсе админки применяют класс
ModelAdmin. Он связывается с моделью и конфигурирует отображение данных этой модели. В этом классе можно настроить параметры отображения. Полный список параметров есть в документации.
В файле posts/admin.py создайте класс PostAdmin, наследующийся от admin.ModelAdmin, и зарегистрируйте его как источник конфигурации для модели Post.
Теперь файл posts/admin.py должен выглядеть так:
Скопировать кодPYTHON
from django.contrib import admin
from .models import Post
class PostAdmin(admin.ModelAdmin):
list_display = ("text", "pub_date", "author")
search_fields = ("text",)
list_filter = ("pub_date",)
admin.site.register(Post, PostAdmin)
Столбцы таблицы в админке изменятся, добавится поле поиска и фильтрация постов по дате публикации. Django понимает, что свойство модели pub_date — это дата, и предложит несколько вариантов фильтрации.
Сохраните код, обновите страницу и посмотрите, что получилось:
Свойства, которые мы настроили:
- list_display — перечень свойств модели, которые мы хотим показать в интерфейсе. Если это свойство не указано — будет отображаться строка
Имя_модели(идентификатор), как было с записью Post(1). - search_fields — перечень полей, по которым будет искать поисковая система. Форма поиска отображается над списком элементов.
- list_filter — поля, по которым можно фильтровать записи. Фильтры отображаются справа от списка элементов.
Помимо этих параметров,
есть много других: например, для управления порядком отображения или количеством элементов на экране.
Пустое поле
В колонку text сейчас выводится содержимое поля text каждого поста. Этот текст — ссылка на форму просмотра и редактирования записи.
Но что делать, если у модели нет описательного поля? Вдруг админ магазина не заполнит название товара или пост в блоге состоит только из картинки без подписи? Поле в админке окажется пустым, и у администратора не будет ссылки на страницу редактирования записи.
Есть несколько способов обыграть эту ситуацию. Прежде всего, у каждой модели существует специальное свойство pk (сокращение от Primary Key, уникальный идентификатор записи в базе данных). Можно вывести Primary Key в интерфейс администратора:
Скопировать кодPYTHON
class PostAdmin(admin.ModelAdmin):
list_display = ("pk", "text", "pub_date", "author")
search_fields = ("text",)
list_filter = ("pub_date",)
В списке постов появится поле с номером записи в базе, каждая запись в админке получит уникальный ID.
Есть и другой способ: вместо пустого поля в строке можно подставлять какое-нибудь дефолтное значение, указав его в конфигурации модели:
Скопировать кодPYTHON
class PostAdmin(admin.ModelAdmin):
list_display = ("pk", "text", "pub_date", "author")
search_fields = ("text",)
list_filter = ("pub_date",)
empty_value_display = "-пусто-"
Теперь слово «пусто» станет ссылкой, по которой админ может кликнуть, чтобы перейти на страницу редактирования поста.