Функциональность для управления комментариями поста уже готова. Теперь нужно адаптировать шаблон 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/ в браузере и кликните на пост, чтоб открыть его. Появится следующее:
Добавьте несколько комментариев с помощью формы. Они должны появится под постом в хронологическом порядке:
Откройте https://127.0.0.1:8000/admin/blog/comment/ в браузере. Вы увидите админ-панель со списком созданных комментариев. Нажмите на один из них для редактирования, уберите галочку с Active и нажмите Save. Программа снова перенаправит на список комментариев, и колонка Active покажет неактивную иконку для следующего комментария. Он будет выглядеть как первое сообщение на следующем скриншоте.
Если вернуться на страницу поста, то будет видно, что удаленный комментарий не отображается и не учитывается в общем количестве. Благодаря полю active
можно отключать неприемлемые сообщения и не показывать их в постах.