Создание системы комментариев
Теперь мы собираемся создать систему комментариев для блога, в которой пользователи смогут комментировать посты. Для построения системы комментариев необходимо:
- Создать модели для сохранения комментариев
- Создать формы для отправки комментариев и их валидации
- Добавлить представление обрабатывающее форму, и сохраняющее комментарии в базе данных
- Изменить шаблон post detail, чтобы отобразить список комментариев и форму для добавления нового комментария
Сначала давайте построим модель для хранения комментариев. Откройте файл models.py приложения блога и добавьте следующий код:
class Comment(models.Model):
post = models.ForeignKey(Post, 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, чтобы связать комментарий с конкретным постом. Это отношение «многие к одному(many-to-one)» определено в модели Comment, так как каждый комментарий будет сделан в одном посте, и каждый пост может иметь несколько комментариев. Атрибут related_name позволяет нам присваивать имя атрибуту, который мы используем для связи. Определив это, мы можем извлечь пост комментария с помощью comment.post и извлечь все комментарии к посту с помощью post.comments.all(). Если атрибут related_name не определен, то Джанго будет использовать имя для модели, за которым следует _set (т. е. comment_set), чтобы вернуть имя объекта.
Можно узнать больше о связях "многие к одному" тут: https://docs.djangoproject.com/en/1.8/topics/db/examples/many_to_one/
Мы указали полю active булево значение, которое будет использоваться для отключения неприемлемых комментариев вручную. Поле created используется для сортировки комментариев по умолчанию в хронологическом порядке.
Созданная нами модель Comment еще не синхронизирована с базой данных. Для создания новой миграции, сообщающей о создании новой модели, выполните следующую команду:
python manage.py makemigrations blog
На выходе вы увидите сообщение:
Migrations for 'blog':
0002_comment.py:
- Create model Comment
Джанго создал файл 0002_comment.py в директории migrations/ приложения блога. Теперь необходимо применить изменения к базе данных. Для применения существующих миграций выполните следующую команду:
python manage.py migrate
Вы увидите следующее сообщение:
Applying blog.0002_comment... OK
Только что созданная миграция была применена, и теперь в базе данных существует таблица blog_comment.
Теперь мы можем добавить новую модель на сайт администрирования, чтобы управлять комментариями через простой интерфейс. Откройте файл admin.py приложения блога и добавьте import для модели Comment, и класс ModelAdmin:
from .models import Post, Comment
class CommentAdmin(admin.ModelAdmin):
list_display = ('name', 'email', 'post', 'created', 'active')
list_filter = ('active', 'created', 'updated')
search_fields = ('name', 'email', 'body')
admin.site.register(Comment, CommentAdmin)
Перейдите в браузере по адресу http://127.0.0.1:8000/admin/ . Вы увидите новую модель, включенную в раздел Blog, как показано на следующем снимке экрана:
Наша модель теперь зарегистрирована на сайте администрирования, и мы можем управлять комментариями с помощью простого интерфейса.