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

Администратор сайта должен иметь возможность управлять публикациями (например, удалять сообщения со спамом). Можно делать это через прямые запросы к базе, но не каждый админ на это способен.В 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 = '-пусто-'  

Теперь слово «пусто» станет ссылкой, по которой админ может кликнуть, чтобы перейти на страницу редактирования поста.





Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: