Простой блог на Django - часть 5. Добавление сущности в админку
Как и анонсировалось в предыдущей заметке, пришло время вынести сущность (приложение) posts в админку. Для этого отредактируем файл posts/admin.py, добавив в него следующие строки:
from .models import Post
admin.site.register(Post)
Таким образом, мы зарегистрировали нашу модель в админке.
Теперь если сохранить изменения и перезагрузить страницу, то в админке можно увидите новый раздел. Здесь нужно подчеркнуть, что модели, зарегистрированные в определённом приложении, будут отображаться в разделе этого приложения - именно по этой причине вы видите модель Posts в секции Posts. И хоть на первый взгляд это и кажется очевидным, сказано это было лишь для того, чтобы подчеркнуть, что модель приложения может быть зарегистрирована и в другом приложении (не обязательно в приложении Posts).
Теперь когда приложение Posts появилось в админке, мы можем перейти в соответствующий раздел и создать новый пост, с помощью ссылки "Add post". Дальше заполняем поле с текстом, выбираем автора и сохраняем запись; при этом она появится в общем списке.
Изменение отображения полей в админке
Итак, пост в админке у нас был создан. Однако, если перейти в список всех постов, то мы обнаружим что у него не слишком казистое представление. Давайте попробуем исправить эту ситуацию. Для этого перейдём в файл posts/admin.py и отнаследуемся от модели ModelAdmin:
class PostAdmin(admin.ModelAdmin):
list_display = ("pk", "title", "pub_date", "author")
search_fields = ("text",)
list_filter = ("pub_date",)
И не забываем указать, откуда будет браться конфигурация для отображения нашей модели. Для этого перепишем строчку с регистрацией:
admin.site.register(Post, PostAdmin)
В итоге, код файла должен получиться таким:
from django.contrib import admin
# Register your models here.
from .models import Post
class PostAdmin(admin.ModelAdmin):
list_display = ("pk", "title", "pub_date", "author")
search_fields = ("text",)
list_filter = ("pub_date",)
admin.site.register(Post, PostAdmin)
Давайте же теперь попробуем разобраться, какая строка за что отвечает:
- list_display - перечень полей, которые будут отображаться в списке постов. Здесь может возникнуть вопрос, что за поле pk у нас такое? Тут всё просто, pk (он же Primary Key) - это первичный ключ, который есть у любой модели и который представляет из себя уникальное цифровое значение.
- search_fields - поля, по которым будет производиться поиск по введённому тексту (данный фильтр отображается над постами).
- list_filter - поля, по которым будет производиться фильтрация в виде списка. В данном случае это дата (отображается справа).
Кастомное отображение значения колонки в админке
Где это может пригодиться? Предположим, перед нами стоит задача сделать колонку с title ссылкой. Для этого в переменной list_display меняем колонку title на псевдоколонку title_href. Такой колонки, понятное дело у нас нет, поэтому Django будет искать одноимённую функцию, вот её-то мы и пропишем:
def title_href(self, obj):
return format_html('<a href="%s">%s</a>' % (obj.id, obj.title))
Что есть что? Мы используем функцию format_html, где в качестве аргумента передаём шаблон, в который с помощью плейсхолдеров %s подставляем переменные obj.id и obj.title Теперь если перезагрузить страницу, то мы увидим что строка с названием поста стала ссылкой. Однако, сама колонка теперь имеет неинформативное название title href. Мы это так же можем исправить, для этого в самом классе пропишем свойство:
title_href.short_description = "Название статьи"
Ну и да, не забудьте импортировать функцию format_html:
from django.utils.html import format_html
Все изменения тут https://github.com/maclen2007/simple_django_blog/commit/0d4e3bcfac7c7c65482d7c41995cefccc2d773bd
Вы должны авторизоваться, чтобы оставлять комментарии.
Комментарии ()