Django 5 для начинающих

Прогресс по курсу:  9/1004

6.5 Создание системы комментариев
4 из 8 шагов пройдено
0 из 16 баллов  получено

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

Мы продолжим работу над расширением приложения для ведения блога, разработав систему комментариев, которая позволит пользователям комментировать посты. Для того чтобы разработать такую систему, понадобится:

  • модель комментария, чтобы хранить комментарии пользователей к постам;
  • форма, которая позволяет пользователям передавать комментарии на обработку и управляет валидацией данных;
  • представление, которое обрабатывает форму и сохраняет новый комментарий в базе данных;
  • список комментариев и форма, чтобы добавлять новый комментарий, который может быть вставлен в шаблон детальной информации о посте.

Разработка модели комментария

Давайте начнем с разработки модели для хранения комментариев пользователей к постам.

Откройте файл 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(Добавить). Вы увидите форму для добавления нового комментария:

Теперь появилась возможность управлять экземплярами комментариев с помощью сайта администрирования.


  • Комментария
Будьте вежливы и соблюдайте наши принципы сообщества. Пожалуйста, не оставляйте решения и подсказки в комментариях, для этого есть отдельный форум.
Оставить комментарий

Небольшая справка по интернационализации и локализации:

1) Можно еще добавить в класс Meta verbose_name = 'комментарий' и verbose_name_plural = 'Комментарии' , то же сделать и с моделью Post

2) В settings.py LANGUAGE_CODE = 'ru-RU'

3) В apps.py у класса BlogConfig установить verbose_name = 'Блог'

4) Наслаждаться результатом:

@Кирилл_Семенихин, хорош

ребят поясните пж, как применяются на практике эти строки и в чем их идея: indexes = [ models.Index(fields=['created']), ]

@Шамбер_Егор, тут мы указываем поле created для его индексации. Индексация ускорит поиск по этому полю и запросы к БД будут выполнятся быстрее. Во втором курсе рассматриваются индексы баз данных.

Я бы хотел узнать, а применяется ли в Джанго мемоизация или данные кэшируются с помощью reddis а задачи распределяются с помощью celery, прост может мемоизацию тоже используют в Джанго при написании алгоритмов, поэтому и интересуюсь.
Изменен Шамбер Егор

@Шамбер_Егор, в Django можно кэшировать всё что угодно: запросы или результаты вычислений, фрагменты шаблонов, представления и даже весь сайт. Документация по кэшированию: https://docs.djangoproject.com/en/5.0/topics/cache/

Подробнее о взаимосвязях многие-к-одному можно узнать в разделе 2.8 данного курса.

ссылка не верная

@Дмитрий_Харламов, Спасибо, исправили.