Регистрация модели Post в админке

Добавим в админку интерфейс для приложения Posts, чтобы администратор сайта получил возможность управлять публикациями.
Модели не добавляются в интерфейс админки автоматически, ведь не все они нужны администратору. По умолчанию в проекте уже есть множество моделей; вы видели, что в результате миграции в базу данных добавилось много таблиц. Но в интерфейсе админки видны только две модели: Groups и Users. Остальные модели — служебные. Они не требуют внимания администратора и потому исключены из интерфейса. Чтобы добавить модель Post в интерфейс администратора, её надо зарегистрировать в файле posts/admin.py.
Пока что файл posts/admin.py пуст:
Скопировать кодPYTHON
from django.contrib import admin # Register your models here.
Добавьте в него такой код:
Скопировать кодPYTHON
from django.contrib import admin # из файла models импортируем модель Post from .models import Post admin.site.register(Post)
Сохраните файл, перезагрузите страницу админки — и вы увидите новый раздел:
image
Все модели, зарегистрированные в admin.py определённого приложения, в админке будут отображаться в разделе этого приложения (при этом сама модель этому приложению может не принадлежать). Например, если зарегистрировать модель Post в admin.py приложения auth — подраздел Posts «переедет» в раздел Authentication and authorization.
Перейдите в раздел Posts: там подготовлено место для списка постов и есть кнопка для создания новой публикации. При нажатии откроется форма для создания поста.
image
Создайте новый пост. Пишите, что хотите; в нашем примере всего два слова: «Буду краток».
С точки зрения разработчика создание нового поста — это создание нового объекта (экземпляра класса) Post. Но класс Post — это модель, так что свойства, переданные в экземпляр этого класса, станут строчками в таблице БД, связанной с моделью.
Поле «Автор» обязательно для заполнения. Если не указать автора, то система выдаст сообщение об ошибке. Но если сделать всё правильно, вы создадите на сайте новую запись:
image
В перечне публикаций строка 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",) # при регистрации модели Post источником конфигурации для неё назначаем класс PostAdmin admin.site.register(Post, PostAdmin)
Столбцы таблицы в админке изменятся, добавится поле поиска и фильтрация постов по дате публикации. Django понимает, что свойство модели pub_date — это дата, и предложит несколько вариантов фильтрации.
Сохраните код, обновите страницу и посмотрите, что получилось:
image
Свойства, которые мы настроили:
Помимо этих параметров, есть много других: например, для управления порядком отображения или количеством элементов на экране.

Пустое поле

В колонку text сейчас выводится содержимое поля text каждого поста. Этот текст — ссылка на форму просмотра и редактирования записи. Но что делать, если у модели нет описательного поля? Вдруг админ магазина не заполнит название товара или пост в блоге состоит только из картинки без подписи? Поле в админке окажется пустым, и у администратора не будет ссылки на страницу редактирования записи.
Есть несколько способов обыграть эту ситуацию. Прежде всего, у каждой модели существует специальное свойство pk (сокращение от Primary Key, уникальный идентификатор записи в базе данных). Можно вывести Primary Key в интерфейс администратора:
Скопировать кодPYTHON
class PostAdmin(admin.ModelAdmin): # добавим в начало столбец pk 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 = "-пусто-" # это свойство сработает для всех колонок: где пусто - там будет эта строка
Теперь слово «пусто» станет ссылкой, по которой админ может кликнуть, чтобы перейти на страницу редактирования поста.