Cat

Django 21. Регистрация модели поста

Модель создали, теперь необходимо выполнить ещё ряд действий. В этом посте, мы зарегистрируем модель в панели администратора и настроим поля.

Все статьи

Icon Link

Дополнительные материалы

Icon Link

Реклама

Icon Link
Сайт на Django proDream 05 Сентябрь 2023 Просмотров: 706

Начнём с регистрации модели в панели администратора. 

Перейдём в файл 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'),

 

Не обращаем внимания на ошибку, у нас же всё ещё нет представления, этим займёмся в следующем посте.

Автор

    Нет комментариев

    Реклама