Создание модели постов
Перейдем в файл models.py, в нем мы добавим следующий код:
from django.db import models
from django.core.validators import FileExtensionValidator
from django.contrib.auth.models import User
class Post(models.Model):
"""
Модель постов для нашего блога
"""
STATUS_OPTIONS = (
('published', 'Опубликовано'),
('draft', 'Черновик')
)
title = models.CharField(verbose_name='Название записи', max_length=255)
slug = models.SlugField(verbose_name='URL', max_length=255, blank=True, unique=True)
description = models.TextField(verbose_name='Краткое описание', max_length=500)
text = models.TextField(verbose_name='Полный текст записи')
thumbnail = models.ImageField(default='default.jpg',
verbose_name='Изображение записи',
blank=True,
upload_to='images/thumbnails/',
validators=[FileExtensionValidator(allowed_extensions=('png', 'jpg', 'webp', 'jpeg', 'gif'))]
)
status = models.CharField(choices=STATUS_OPTIONS, default='published', verbose_name='Статус записи', max_length=10)
create = models.DateTimeField(auto_now_add=True, verbose_name='Время добавления')
update = models.DateTimeField(auto_now=True, verbose_name='Время обновления')
author = models.ForeignKey(to=User, verbose_name='Автор', on_delete=models.SET_DEFAULT, related_name='author_posts',
default=1)
updater = models.ForeignKey(to=User, verbose_name='Обновил', on_delete=models.SET_NULL, null=True,
related_name='updater_posts', blank=True)
fixed = models.BooleanField(verbose_name='Прикреплено', default=False)
class Meta:
db_table = 'blog_post'
ordering = ['-fixed', '-create']
indexes = [models.Index(fields=['-fixed', '-create', 'status'])]
verbose_name = 'Статья'
verbose_name_plural = 'Статьи'
def __str__(self):
return self.title
Давайте разберем подробнее поля нашей модели:
title- заголовок, с максимальным количеством символов 255.slug- ссылка на материал (латиница), или в простонародии ЧПУ-человеко-понятный урл, с максимальным количеством символов 255,blank(необязательно к заполнению)description- текстовое поле, ограниченное 500 символами.text- аналогично, без ограничений.thumbnail- изображение записи.status- опубликована статья, или черновик.createиupdate- время создания и обновления записей.author- ключ ссылаемый на пользователя из другой таблицы c параметромon_delete=SET_DEFAULT(при удалении все записи пользователя передаются администратору)updater- ключ ссылаемый на пользователя, с параметромon_delete=models.SET_NULL(при удалении пользователя просто убирается значение того, кто обновил)fixed- булево значение, по умолчаниюFalse(не закреплено)
Также по мета классу:
db_table- название таблицы в БД. (можно не добавлять, будет создано автоматически)ordering- сортировка, ставим-fixed, чтобы выводились статьи которые прикреплены. То есть они будут всегда вверху страницы. Далее укажем-created_at, чтобы выводились статьи в обратном порядке (сначала новые, потом старые).indexes- индексирование полей, чтобы ускорить результаты сортировки.verbose_name- название модели в админ панели.verbose_name_plural- название модели во множественном числе.
Django требует от нас установки pillow библиотеки всякий раз, когда мы работаем с ImageField, поэтому перейдите в свой терминал и введите следующее:
pip install Pillow
Добавление модели в админ-панель
Давайте добавим модель в администравную панель, откроем файл apps/blog/admin.py и напишем следующий код:
from django.contrib import admin
from .models import Post
admin.site.register(Post)
На этом разработку моделей постов мы закончили, в следующем разделе мы приступим к разработке древовидной системы категорий постов.