Администратор сайта должен иметь возможность управлять публикациями (например, удалять сообщения со спамом). Можно делать это через прямые запросы к базе, но не каждый админ на это способен.В Django предусмотрен графический интерфейс для администрирования любой модели: надо только подключить эту модель к админ-зоне. Так и поступим. Модели не добавляются в интерфейс админки автоматически, ведь не все они нужны администратору. По умолчанию в проекте уже есть множество моделей; вы видели, что в результате миграции в базу данных добавилось много таблиц. Но в интерфейсе админки видны только две модели: Groups
и Users
. Остальные модели — служебные, они не требуют внимания администратора и потому исключены из интерфейса. Чтобы добавить модель Post
в интерфейс администратора, её надо зарегистрировать в файле posts/admin.py
. Пока что файл posts/admin.py
пуст:
from django.contrib import admin
# Register your models here.
Добавьте в него такой код:
from django.contrib import admin
# Из модуля models импортируем модель Post
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
должен выглядеть так:
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
— это дата, и предложит несколько вариантов фильтрации.
Свойства, которые мы настроили:
- list_display — перечень свойств модели, которые мы хотим показать в интерфейсе. Если это свойство не указано, будет отображаться строка
Имя_модели(идентификатор)
, как было с записью Post(1). - search_fields — перечень полей, по которым будет искать поисковая система. Форма поиска отображается над списком элементов.
- list_filter — поля, по которым можно фильтровать записи. Фильтры отображаются справа от списка элементов.
Помимо этих параметров, есть много других: например, для управления порядком отображения или количеством элементов на экране.
Пустое поле
В колонку text сейчас выводится содержимое поля text
каждого поста. Этот текст — ссылка на форму просмотра и редактирования записи. Но что делать, если у модели нет описательного поля? Вдруг админ и-магазина не заполнит название товара или пост в блоге состоит только из картинки без подписи? Поле в админке окажется пустым, и у администратора не будет ссылки на страницу редактирования записи.Есть несколько способов обыграть эту ситуацию. Прежде всего, у каждой модели существует специальное свойство pk
(сокращение от primary key, уникальный идентификатор записи в базе данных). Можно вывести primary key в интерфейс администратора:
class PostAdmin(admin.ModelAdmin):
# Добавим в начало столбец pk
list_display = ('pk', 'text', 'pub_date', 'author')
search_fields = ('text',)
list_filter = ('pub_date',)
В списке постов появится поле с номером записи в базе, каждая запись в админке получит уникальный ID. Другой способ: вместо пустого поля в строке можно подставлять какое-нибудь дефолтное значение, указав его в конфигурации модели:
class PostAdmin(admin.ModelAdmin):
list_display = ('pk', 'text', 'pub_date', 'author')
search_fields = ('text',)
list_filter = ('pub_date',)
# Это свойство сработает для всех колонок: где пусто — там будет эта строка
empty_value_display = '-пусто-'
Теперь слово «пусто» станет ссылкой, по которой админ может кликнуть, чтобы перейти на страницу редактирования поста.