Простой блог на 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

Комментарии ()

    Вы должны авторизоваться, чтобы оставлять комментарии.