Блог на Django #25: Добавление комментариев в шаблон поста

1524

Функциональность для управления комментариями поста уже готова. Теперь нужно адаптировать шаблон post/detail.html, чтобы он делал следующие вещи:

  • Отображал общее количество комментариев для поста.
  • Отображал список комментариев.
  • Отображал форму для добавления нового комментария.

Сначала нужно добавить все комментарии. Откройте шаблон post/detail.html и добавьте следующий код в блок content:

{% with comments.count as total_comments %}  
  <h2>  
    {{ total_comments }} comment{{ total_comments|pluralize }}  
  </h2>  
{% endwith %}

Здесь в шаблоне используется ORM Django — она исполняет QuerySet comments.count(). Важно отметить, что язык шаблонов Django не использует скобки для вызова методов. Тег {% with %} позволяет присвоить значение новой переменной. Она будет доступна вплоть до тега {% endwith %}.

Тег шаблона {% with %} полезен, поскольку позволяет избежать риска изменения базы данных или доступа к методам по несколько раз.

Фильтр шаблона pluralize используется для отображения суффикса множественного числа в слове comment в зависимости от значения total_comments. Фильтры принимают значение переменной, к которой их применяли, в качестве ввода и возвращают вычисленное значение. Фильтрам шаблона будет посвящена отдельная тема.

Фильтр pluralize возвращает строку с символом «s», если значение отличается от 1. Текст отрендерится как 0 comments, 1 comment или N comments. Django включает множество тегов и фильтров шаблона, с помощью которых можно отображать желаемую информацию.

Теперь включим список комментариев. Добавьте следующие строки в шаблон post/detail.html перед предыдущим кодом:

{% for comment in comments %}  
  <div class="comment">  
    <p class="info">  
      Comment {{ forloop.counter }} by {{ comment.name }}  
      {{ comment.created }}  
    </p>  
  {{ comment.body|linebreaks }}  
  </div>  
{% empty %}  
  <p>There are no comments yet.</p>  
{% endfor %}

Тег шаблона {% for %} используется, чтобы перебирать комментарии. Сообщение по умолчанию отображается в том случае, если список comments пустой. Оно говорит о том, что к посту комментарии не оставляли. Перечисляются они с помощью переменной {{ forloop.counter }}, которая содержит счетчик цикла в каждой итерации. Затем отображаются имя автора, дата и тело комментария.

Наконец, нужно отрендерить форму или отобразить сообщение об успехе, если сообщение было проверено. Добавьте следующие строки под предыдущим кодом:

{% if new_comment %}  
  <h2>Your comment has been added.</h2>  
{% else %}  
  <h2>Add a new comment</h2>  
  <form action="." method="post">  
    {{ comment_form.as_p }}  
    {% csrf_token %}  
    <p><input type="submit" value="Add comment"></p>  
  </form>
{% endif %}
Python data course

Он должен быть понятен: если объект new_comment существует, отображается сообщение об успехе. В противном случае рендерится элемент абзаца <p> для каждого поля с включенным CSRF-токеном, который обязателен для запросов POST. Откройте https://127.0.0.1:8000/blog/ в браузере и кликните на пост, чтоб открыть его. Появится следующее:
Добавление комментария на сайт Django

Добавьте несколько комментариев с помощью формы. Они должны появится под постом в хронологическом порядке:

Несколько комментариев на сайт Django

Откройте https://127.0.0.1:8000/admin/blog/comment/ в браузере. Вы увидите админ-панель со списком созданных комментариев. Нажмите на один из них для редактирования, уберите галочку с Active и нажмите Save. Программа снова перенаправит на список комментариев, и колонка Active покажет неактивную иконку для следующего комментария. Он будет выглядеть как первое сообщение на следующем скриншоте.

Управление комментариями из админ-панели

Если вернуться на страницу поста, то будет видно, что удаленный комментарий не отображается и не учитывается в общем количестве. Благодаря полю active можно отключать неприемлемые сообщения и не показывать их в постах.

Учитесь программировать по книгам, подписывайте на телеграм каналы:

Книги Python разработчика RU / EN

Книги / Data Science / RU-EN

Тест на знание python

Какой будет результат выполнения этого кода?
Что выведет этот код?
Какой цикл `for` выведет такой результат?
Что делает функция re.match()?
Что выведет этот код?
Александр
Я создал этот блог в 2018 году, чтобы распространять полезные учебные материалы, документации и уроки на русском. На сайте опубликовано множество статей по основам python и библиотекам, уроков для начинающих и примеров написания программ. Пишу на популярные темы: веб-разработка, работа с базами данных, data sciense и другие...