Добавление комментариев в шаблон post detail
Мысоздали функциональные возможности для управления комментариями блога. Теперь нам нужно адаптировать наш post_detail.html шаблон, чтобы получить следующий функционал:
- Отображение общего числа комментариев конкретной записи
- Отображение списка комментариев
- Отображение формы для добавления нового комментария
Во-первых, мы добавим общее количество комментариев. Откройте шаблон blog_detail.html и добавьте следующий код вcontentblock:
{% with comments.count as total_comments %}
<h2>
{{ total_comments }} comment{{ total_comments|pluralize }}
</h2>
{% endwith %}
Мы используем Django ORM в шаблоне, выполняющем запрос comments.count(). Обратите внимание, что язык шаблона «Джанго» не использует круглые скобки для вызова методов. Тег{% with %}
позволяет нам присвоить значение новой переменной, которая будет доступна до тех пор, пока тег{% endwith %}
не будет использован.
Тег шаблона полезен, чтобы избежать попадания в базу данных или многократного доступа к дорогостоящим методам.
Фильтр шаблона pluralize используется для отображения суффикса множественного числа для комментария в зависимости от значения total_comments. Фильтры шаблонов принимают значение переменной, к которой они применяются в качестве входных данных, и возвращают вычисляемое значение. Мы рассмотрим фильтры шаблонов в главе 3.
Фильтр шаблона pluralize отображает "s", если значение отличается от 1. Предыдущий текст будет отображен как 0 комментариев, 1 комментарий или n комментариев. Джанго включает множество тегов шаблонов и фильтров, помогающих отображать информацию в желаемом виде.
Подробнее про pluralize, другие фильтры и шаблонные теги можно прочитать здесьhttp://djbook.ru/rel1.9/ref/templates/builtins.html?highlight=pluralize\#std:templatefilter-pluralize
Теперь давайте включим список комментариев. Добавьте следующие строки в шаблон после предыдущего кода:
{% 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 %}
. Отображается сообщение по умолчанию, если список комментариев пуст. Мы перечислим комментарии с переменной{{ 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. Откройте http://127.0.0.1:8000/blog/ в обраузере и пройдите в любой из созданных вами постов. Вы увидите следующее:
Добавьте пару комментариев с помощью формы. Они должны появиться под вашим постом в хронологическом порядке, например:
Откройте http://127.0.0.1:8000/admin/blog/comment/ в браузере. Административная часть сайта появится с созданным списком комментариев. Щелкните один из них для редактирования, снимите флажок "активный" и нажмите кнопку "Сохранить". Вы снова будете перенаправленыя в список комментариев, а в активном столбце отобразится неактивный значок для комментария. Он должен выглядеть как первый комментарий на следующем снимке экрана:
При возврате к post detail view вы увидите,что удаленный комментарий больше не отображается; также не учитывается общее число комментариев. Благодаря полю Active можно отключить ненужные комментарии и избежать их отображения в ваших постах.