Файлы
practice
migrations
__init__.py
0001_initial.py
models.py
__init__.py
apps.py
admin.py
tests.py
views.py
task32admin
__init__.py
settings.py
urls.py
wsgi.py
manage.py
manage.py
Урок 8: Регистрация модели Post в админке
Перед вами альфа-версия проекта для любителей хранить музыку на компакт-дисках. Пока что в нем есть только модель CD для хранения информации об альбомах. Модель вы найдете в приложении practice: practice/models.py
Cконфигурируйте модель так, чтобы администратору сайта было удобно работать с ней в админке.
В админ-зоне должны быть видны такие поля:
  • название альбома
  • дата релиза
  • артист
  • жанр
Должна быть фильтрация записей по полям:
  • дата релиза
  • жанр
Пустые поля в записях должны заполняться строкой -пусто-
После выполнения задания задеплойте проект в тренажёре (кнопка Задеплоить), затем откройте в новом окне браузера свой проект (по ссылке вверху справа в интерфейсе тренажёра), перейдите на страницу /admin и авторизуйтесь: логин admin, пароль admin. В админке проверьте результат своей работы.
Браузер699x934
Браузер699x934

Регистрация модели 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
Свойства, которые мы настроили:
  • list_display — перечень свойств модели, которые мы хотим показать в интерфейсе. Если это свойство не указано — будет отображаться строка Имя_модели(идентификатор), как было с записью Post(1).
  • search_fields — перечень полей, по которым будет искать поисковая система. Форма поиска отображается над списком элементов.
  • list_filter — поля, по которым можно фильтровать записи. Фильтры отображаются справа от списка элементов.
Помимо этих параметров, есть много других: например, для управления порядком отображения или количеством элементов на экране.

Пустое поле

В колонку 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 = "-пусто-" # это свойство сработает для всех колонок: где пусто - там будет эта строка
Теперь слово «пусто» станет ссылкой, по которой админ может кликнуть, чтобы перейти на страницу редактирования поста.
Переименовать
Удалить файл
Переименовать
Удалить файл
Переименовать
Новый файл
Новая папка
Удалить папку
Переименовать
Удалить файл
Переименовать
Удалить файл
Переименовать
Удалить файл
Переименовать
Удалить файл
Переименовать
Удалить файл
Переименовать
Удалить файл
Переименовать
Новый файл
Новая папка
Удалить папку
Переименовать
Удалить файл
Переименовать
Удалить файл
Переименовать
Удалить файл
Переименовать
Удалить файл
Переименовать
Новый файл
Новая папка
Удалить папку
Переименовать
Удалить файл
Новый файл
Новая папка