Создание системы комментариев

Теперь мы собираемся создать систему комментариев для блога, в которой пользователи смогут комментировать посты. Для построения системы комментариев необходимо:

  • Создать модели для сохранения комментариев
  • Создать формы для отправки комментариев и их валидации
  • Добавлить представление обрабатывающее форму, и сохраняющее комментарии в базе данных
  • Изменить шаблон 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, как показано на следующем снимке экрана:

Наша модель теперь зарегистрирована на сайте администрирования, и мы можем управлять комментариями с помощью простого интерфейса.

results matching ""

    No results matching ""