Добавим на наш сайт блог. Блог будет состоять из 3 страниц:

  • blog_index - индексная страница со всеми записями блога;
  • blog_detail - детальная страница, с полным описанием записи блога;
  • blog_category - страница с записями блога выбранной категории. 

Создадим новое приложение blog для нашего проекта.

python manage.py startapp blog

Добавим новую строчку в файл personal_porfolio/settings.py (строка 9):

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'projects',
    'blog',
]

Модель

Для блога нам нужны 3 модели:

  1. Post
  2. Category
  3. Comment

Причем таблицы моделей должны быть связаны между собой. Посты и категории должны иметь связь Многие-Ко-Многим, а посты и комментарии должны иметь связь Один-Ко-Многим.

Добавим классы моделей в файл my-portfolio\blog\models.py:

from django.db import models

class Category(models.Model):
    name = models.CharField(max_length=20)

    class Meta:
        verbose_name_plural = 'categories'

    def __str__(self):
        return self.name        

class Post(models.Model):
    title = models.CharField(max_length=255)
    body = models.TextField()
    created_on = models.DateTimeField(auto_now_add=True)
    last_modified = models.DateTimeField(auto_now=True)
    categories = models.ManyToManyField('Category', related_name='posts')

    def __str__(self):
        return self.title    

class Comment(models.Model):
    author = models.CharField(max_length=60)
    body = models.TextField()
    created_on = models.DateTimeField(auto_now_add=True)
    post = models.ForeignKey('Post', on_delete=models.CASCADE)

В строчке 15 в качестве параметра метода DateTimeField мы указываем auto_now_add=True. Теперь каждый раз при изменении объекта этого класса будет меняться поле date_modified в таблице.

В строчке 17 мы определяем связь Многие-Ко-Многим. В параметрах метода указываем модель, с которой мы устанавливаем связь и то, как мы будем получать все посты из этой модели. То есть все посты категории мы сможем получить с помощью команды category.posts.

В строчке 26 мы определяем связь Один-Ко-Многим. В параметрах метода указываем связанную модель, и то, что при удалении поста будут удаляться все его комментарии (on_delete=models.CASCADE).

Осталось создать файл миграции и таблицы в БД:

python manage.py makemigrations blog

python manage.py migrate

После запуска команд были также созданы таблицы, относящиеся к работе с админ-панелью Джанго. Мы будем использовать ее для создания тестовых постов.