Django 21. Регистрация модели поста
Модель создали, теперь необходимо выполнить ещё ряд действий. В этом посте, мы зарегистрируем модель в панели администратора и настроим поля.
Дополнительные материалы
Для скачивания материалов необходимо войти или зарегистрироваться
Файлы также можно получить в Telegram-боте по коду: 810542
Реклама
Начнём с регистрации модели в панели администратора.
Перейдём в файл admin.py
и создадим класс PostAdmin
унаследованный от admin.ModelAdmin
. Так же не забудьте про декоратор над классом или строку с регистрацией класса в самом низу файла, в зависимости от того, каким способом вы регистрируете модель.
Далее создаём 7 полей:
list_display
- Список имен полей модели, которые должны быть отображены в списке объектов.list_filter
- Список имен полей, по которым Django создаст фильтры в правой части страницы изменения списка.search_fields
- Активирует поиск в правом верхнем углу страницы со списком объектов.prepopulated_fields
- Словарь, определяющий поля, которые должны быть автоматически заполнены из значений других полей.date_hierarchy
- ПоляDateField
илиDateTimeField
в модели, которые должны быть использованы навигации по датам.ordering
- Указывает порядок расположения записей на странице.exclude
- Список полей, которые будут исключены из формы создания/редактирования объекта.
Автоматическое добавление автора.
Поскольку по умолчанию, при создании нового объекта, в нашем случае нового поста, поле Автор будет представлять собой выпадающий список со всеми зарегистрированными пользователями - нам это ни к чему.
Мы скрываем поле author
со страницы создания/редактирования поста добавив поле в список exclude
.
Для того чтобы пользователь подставлялся в поле автоматически, мы переопределяем метод сохранения объекта.
Создадим метод save_model
, принимающий ряд аргументов.
В теле метода, мы в поле author
у будущего поста подставляем текущего пользователя. Сохраняем объект и вызовем родительский метод для сохранения модели.
Превью изображения поста.
Для того, что бы в столбцы объектов добавить отображение превью поста, создадим метод image_preview
передав в него self
и obj
.
В теле метода проверяем, есть ли изображение у объекта поста или нет. Если его нет, то вернём строку No image found
. Если изображение есть(а у нас оно всегда будет, но дополнительная защита всё же не повредит), то мы с помощью функции format_html
, возвращаем тег img
с путём до изображения.
Обратите внимание! Pycharm будет ругаться и просить сделать метод статическим, т.к. он не использует self. Игнорируем эту ошибку, поскольку нам необходимо, что бы метод знал, в каком классе он вызван, иначе он будет работать не корректно или вовсе не будет работать, если его сделать статическим.
И ниже, после метода добавим переопределение названия нового поля image_preview
.
Код:
from django.utils.html import format_html
@admin.register(models.PostModel)
class PostAdmin(admin.ModelAdmin):
list_display = ['title', 'image_preview', 'author', 'category', 'publish', 'created',
'updated', 'views', 'status', ]
list_filter = ['status', 'publish', 'author', ]
search_fields = ['title', 'body', ]
prepopulated_fields = {'slug': ('title',)}
date_hierarchy = 'publish'
ordering = ['status', 'publish', ]
exclude = ["author", 'views', ]
def save_model(self, request, obj, form, change):
obj.author = request.user
obj.save()
super().save_model(request, obj, form, change)
def image_preview(self, obj):
if obj.image:
return format_html(f'<img src="{obj.image.url}" width="100"/>')
else:
return '(No image found)'
image_preview.short_description = 'Превью'
URL-паттерн страницы поста.
Перейдём в файл urls.py
в директории приложения и в паттерны сайта, добавим для страницы поста, следующую строку:
path('post/<int:pk>-<str:slug>/', views.post_page, name='post_page'),
Не обращаем внимания на ошибку, у нас же всё ещё нет представления, этим займёмся в следующем посте.
Все статьи