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

Функциональность для управления комментариями поста уже готова. Теперь нужно адаптировать шаблон 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 %}

Он должен быть понятен: если объект 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 Q << и задавайте вопросы. Спрашивайте по контенту, про python и программирование в целом. Обещаю отвечать.

Вам помогла эта статья? Поделитесь в соцсетях или блоге. Репосты помогают сайту развиться.

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

Что нужно вcтавить после "if", для вывода "x четное число"
Что делает функция re.match()?
Какой будет результат выполнения этого кода?
Какой будет результат выполнения кода в python 3 — print(3/5) ?
Верно ли данное утверждение: "В Python есть два типа данных: числа и строки"?
Александр
Я создал этот блог в 2018 году, чтобы распространять полезные учебные материалы, документации и уроки на русском. На сайте опубликовано множество статей по основам python и библиотекам, уроков для начинающих и примеров написания программ.