Создание системы комментариев
Мы продолжим работу над расширением приложения для ведения блога, разработав систему комментариев, которая позволит пользователям комментировать посты. Для того чтобы разработать такую систему, понадобится:
- модель комментария, чтобы хранить комментарии пользователей к постам;
- форма, которая позволяет пользователям передавать комментарии на обработку и управляет валидацией данных;
- представление, которое обрабатывает форму и сохраняет новый комментарий в базе данных;
- список комментариев и форма, чтобы добавлять новый комментарий, который может быть вставлен в шаблон детальной информации о посте.
Разработка модели комментария
Давайте начнем с разработки модели для хранения комментариев пользователей к постам.
Откройте файл models.py приложения blog и добавьте в него следующий ниже исходный код:
class Comment(models.Model):
post = models.ForeignKey(Post,
on_delete=models.CASCADE,
related_name='comments')
name = models.CharField(max_length=80)
email = models.EmailField()
body = models.TextField()
created = models.DateTimeField(auto_now_add=True)
updated = models.DateTimeField(auto_now=True)
active = models.BooleanField(default=True)
class Meta:
ordering = ['created']
indexes = [
models.Index(fields=['created']),
]
def __str__(self):
return f'Comment by {self.name} on {self.post}'
Это модель Comment. Поле ForeignKey было добавлено для того, чтобы связать каждый комментарий с одним постом. Указанная взаимосвязь многие-к-одному определена в модели Comment, потому что каждый комментарий будет делаться к одному посту, и каждый пост может содержать несколько комментариев.
Атрибут related_name позволяет назначать имя атрибуту, который используется для связи от ассоциированного объекта назад к нему.
Пост объекта комментариев можно извлекать посредством comment.post и все комментарии, ассоциированные с объектом-постом, – посредством post.comments.all().
Если атрибут related_name не определен, то Django будет использовать имя модели в нижнем регистре, за которым следует _set (то есть comment_set), чтобы именовать взаимосвязь ассоциированного объекта с объектом модели, в которой эта взаимосвязь была определена.
Подробнее о взаимосвязях многие-к-одному можно узнать в разделе 3.4 данного курса.
Мы определили булево поле active, чтобы управлять статусом комментариев. Данное поле позволит деактивировать неуместные комментарии вручную с помощью сайта администрирования. Мы используем параметр default=True, чтобы указать, что по умолчанию все комментарии активны.
Мы определили поле created, чтобы хранить дату и время создания комментария. Используя auto_now_add, дата будет сохраняться автоматически при создании объекта.
В Meta-класс модели был добавлен атрибут ordering = ['created'], чтобы по умолчанию сортировать комментарии в хронологическом порядке и индексировать поля created в возрастающем порядке.
В результате этого будет повышена производительность операций поиска в базе данных и упорядочивания результатов с использованием поля created.
Разработанная модель Comment не синхронизирована с базой данных, и поэтому необходимо сгенерировать новую миграцию в базе данных, чтобы создать соответствующую таблицу базы данных:
python manage.py makemigrations blog
python manage.py migrate
Добавление комментариев на сайт администрирования
Далее мы добавим новую модель на сайт администрирования, чтобы управлять комментариями через простой интерфейс.
Откройте файл admin.py приложения blog, импортируйте модель Comment и добавьте следующее:
from .models import Post, Comment
@admin.register(Comment)
class CommentAdmin(admin.ModelAdmin):
list_display = ['name', 'email', 'post', 'created', 'active']
list_filter = ['active', 'created', 'updated']
search_fields = ['name', 'email', 'body']
Запустим сервер и войдем в нашу админ панель чтобы проверить что новая модель была вставлена в раздел BLOG:
Теперь модель зарегистрирована на сайте администрирования.
В строке Comments(Комментарии) кликните по Add(Добавить). Вы увидите форму для добавления нового комментария:
Теперь появилась возможность управлять экземплярами комментариев с помощью сайта администрирования.