Django 20. Модель поста
Сегодня напишем модель поста. Текста будет много и кода тоже.
Дополнительные материалы
Для скачивания материалов необходимо войти или зарегистрироваться
Файлы также можно получить в Telegram-боте по коду: 398438
Реклама
Откроем файл 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-паттерн и сделать шаблон страницы с постом. Этим займёмся в следующих постах.
Все статьи