Добавим на наш сайт блог. Блог будет состоять из 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 модели:
- Post
- Category
- 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
После запуска команд были также созданы таблицы, относящиеся к работе с админ-панелью Джанго. Мы будем использовать ее для создания тестовых постов.