Пришло время создать систему комментариев для блога, с помощью которой пользователи смогут делиться мыслями о прочитанных материалах. Для этого понадобится проделать следующие шаги:
- Создать модель для сохранения комментариев.
- Создать форму для отправки комментариев и проверки введенных данных.
- Добавить представление, которое будет обрабатывать форму и сохранять комментарий в системе.
- Отредактировать шаблон поста для отображения списка комментариев и формы для добавления нового.
Сначала создадим модель для сохранения комментариев. Откройте файл 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',)
def __str__(self):
return 'Comment by {} on {}'.format(self.name, self.post)
Это модель Comment
. Она содержит внешний ключ ForeignKey
для ассоциации с конкретным постом. Это отношение многое к одному определено в модели Comment
, потому что каждый комментарий предназначен для одной записи, но у поста может быть несколько комментариев. Атрибут related_name
позволяет назвать атрибут, используемый для связи объектов. После его определения можно будет получать пост, для которого оставлен комментарий, с помощью comment.post
. Все комментарии можно будет получить с помощью post.comments.all()
. Если этот атрибут не определить, Django будет использовать имя модели маленькими буквами и __set
(например, comment_set
). Так будет называться менеджер связанного объекта.
Больше о связи много к одному можно почитать здесь: https://docs.djangoproject.com/en/2.0/topics/db/examples/many_to_one/.
Есть булево поле active
, которое используется для ручного отключения неприемлемых комментариев. А поле created
нужно для сортировки комментариев в хронологическом порядке по умолчанию.
Новая модель comment
не синхронизирована с базой данных. Запустите следующую команду для создания миграции, которая отметит создание новой модели:
python manage.py makemigrations blog
Появится следующий вывод:
Migrations for 'blog':
blog/migrations/0002_comment.py
- Create model Comment
Django сгенерировал файл 0002_comment.py
в папке migrations/
приложения blog
. Теперь нужно создать схему связанной базы данных и применить изменения к базе данных. Воспользуйтесь командой для применения существующих миграций:
python manage.py migrate
Вывод будет включать следующую строку:
Applying blog.0002_comment... OK
Миграция была применена, а таблица blog_comment
существует в базе данных.
Теперь можно добавить новую модель в административный сайт, чтобы управлять комментариями через простой интерфейс. Откройте admin.py
приложения blog
, импортируйте модель Comment
и добавьте следующий класс ModelAmdin
:
@admin.register(Comment)
class CommentAdmin(admin.ModelAdmin):
list_display = ('name', 'email', 'post', 'created', 'active')
list_filter = ('active', 'created', 'updated')
search_fields = ('name', 'email', 'body')
Запустите сервер разработки с помощью python manage.py runserver
и откройте ссылку https://127.0.0.1:8000/admin/ в браузере. Вы увидите, что новая модель отображается в разделе BLOG, как на скриншоте:
Модель зарегистрирована в административном сайте, а это значит, что экземплярами Comment
можно управлять с помощью простого интерфейса.