Cat

Django 20. Модель поста

Сегодня напишем модель поста. Текста будет много и кода тоже.

Все статьи

Icon Link

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

Icon Link

Реклама

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

Откроем файл models.py и создадим новый класс PostModel унаследованный от models.Model.

Создадим вложенный класс Status унаследованный от models.TextChoices, в котором создадим два поля для статуса поста: Черновик и Опубликован.

Далее начнём описывать поля модели. У нас их будет 13 штук:

  • title - поле с заголовком поста. Тип CharField.
  • slug - поле преобразованное из заголовка в безопасный набор символов. Тип SlugField.
  • image - поле для изображения поста. Тип ImageField.
  • author - поле со ссылкой на пользователя, написавшего пост. Тип ForeignKey.
  • category - поле со ссылкой на категорию. Тип TreeForeignKey.
  • short_body - поле с коротким описанием/содержанием поста. Тип CKEditor5Field.
  • full_body - поле с основным текстом поста. Тип CKEditor5Field.
  • publish - поле с датой публикации поста. Тип DateTimeField.
  • created - поле с датой создания поста. Тип DateTimeField.
  • updated - поле с датой обновления поста. Тип DateTimeField.
  • status - поле со статусом поста. Выбор статуса происходит из класса Status. Тип CharField.
  • views - поле со счётчиком просмотров. Тип IntegerField. Стоит отметить, что это не уникальные просмотры, а буквально каждое обновление страницы с постом, возможно в будущем, поле доработаем.
  • objects - поле с определением менеджера для модели. Тип Manager.

Далее вложенный класс Meta со следующими полями:

  • ordering - определяем сортировку по дате публикации от самого нового.
  • indexes - определяем индексирование базы данных по полю публикации.
  • verbose_name и verbose_name_plural - определяем имя и множественное имя модели.

Метод get_absolute_url, возвращает URL-адрес для объекта модели.

Методы get_next_post и get_previous_post возвращают следующий и предыдущий пост в данной категории основываясь на дате публикации.

Dunder-метод __str__ возвращает заголовок поста.

 

Код:

from django_ckeditor_5.fields import CKEditor5Field
from django.contrib.auth.models import User
from django.utils import timezone

class PostModel(models.Model):
    """Модель поста"""

    class Status(models.TextChoices):
        """Класс выбора статуса поста"""
        DRAFT = 'ЧЕ', 'Черновик'
        PUBLISHED = 'ОП', 'Опубликовано'

    title = models.CharField(max_length=200,
                             verbose_name="Заголовок")
    slug = models.SlugField(verbose_name="Альт. заголовок")
    image = models.ImageField(upload_to='post/%Y/%m/%d',
                              default='default/not_found.png',
                              verbose_name='Изображение поста')
    author = models.ForeignKey(User,
                               on_delete=models.CASCADE,
                               related_name='post',
                               verbose_name="Автор")
    category = TreeForeignKey('CategoryModel',
                              on_delete=models.PROTECT,
                              related_name='post',
                              verbose_name='Категория')
    short_body = CKEditor5Field(max_length=350,
                                verbose_name="Краткое описание",
                                blank=True)
    full_body = CKEditor5Field(verbose_name='Содержимое поста')
    publish = models.DateTimeField(default=timezone.now,
                                   verbose_name="Опубликовано")
    created = models.DateTimeField(auto_now_add=True,
                                   verbose_name="Создано")
    updated = models.DateTimeField(auto_now=True,
                                   verbose_name="Обновлено")
    status = models.CharField(max_length=2,
                              choices=Status.choices,
                              default=Status.DRAFT,
                              verbose_name="Статус")
    views = models.IntegerField(default=0,
                                verbose_name="Количество просмотров")

    objects = models.Manager()

    class Meta:
        ordering = ['-publish']
        indexes = [
            models.Index(fields=['-publish']),
        ]
        verbose_name = 'Пост'
        verbose_name_plural = 'Посты'

    def get_absolute_url(self):
        """Метод получения URL-адреса объекта"""
        return reverse('blog:post_page', args=[int(self.pk), str(self.slug)])

    def get_next_post(self):
        """Метод получения следующего поста"""
        try:
            return self.get_next_by_publish(category=self.category)
        except PostModel.DoesNotExist:
            return None

    def get_previous_post(self):
        """Метод получения предыдущего поста"""
        try:
            return self.get_previous_by_publish(category=self.category)
        except PostModel.DoesNotExist:
            return None

    def __str__(self):
        return self.title

При желании, поле description в модели категории, так же можно изменить на CKEditor5Field, добавив в него графический редактор

 

Применим миграции:

python manage.py makemigrations

python manage.py migrate

По аналогии с моделью категории нам далее необходимо: Зарегистрировать модель в панели администратора, написать представление для страницы поста, добавить URL-паттерн и сделать шаблон страницы с постом. Этим займёмся в следующих постах.

Автор

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

    Реклама