Django 5 для начинающих

Прогресс по курсу:  9/1004

10.1 Начало работы, создание модели статей
3 из 3 шагов пройдено

Создание модели постов

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

На этом разработку моделей постов мы закончили, в следующем разделе мы приступим к разработке древовидной системы категорий постов.


  • Комментария
Будьте вежливы и соблюдайте наши принципы сообщества. Пожалуйста, не оставляйте решения и подсказки в комментариях, для этого есть отдельный форум.
Оставить комментарий

У поля thumbnail модели Post имеет смысл указать атрибут default, так как это поле необязательное. А то там дальше этот случай не обрабатывается в шаблоне и все может упасть.

Изменен Кирилл Семенихин

@Кирилл_Семенихин, Спасибо, добавил.

В коде модели поле author:

on_delete=models.SET_DEFAULT

а в пояснении "on_delete=models.PROTECT". И updater тоже не совпадает

@Иван, Спасибо, исправил.