Добавление комментариев в шаблон детальной информации о посте
Далее необходимо отредактировать шаблон blog/post/detail.html, чтобы реализовать следующее:
- показывать общее число комментариев к посту;
- показывать список комментариев;
- показывать форму для добавления пользователями новых комментариев.
Мы начнем с добавления общего числа комментариев к посту.
Отредактируйте шаблон blog/post/detail.html, внеся в него изменения, как показано ниже:
{% extends "blog/base.html" %}
{% block title %}{{ post.title }}{% endblock %}
{% block content %}
<h1>{{ post.title }}</h1>
<p class="date">
Published {{ post.publish }} by {{ post.author }}
</p>
{{ post.body|linebreaks }}
<p>
<a href="{% url 'blog:post_share' post.id %}">
Share this post
</a>
</p>
{% with comments.count as total_comments %}
<h2>
{{ total_comments }} comment{{ total_comments|pluralize }}
</h2>
{% endwith %}
{% endblock %}
В указанном шаблоне мы используем Django ORM-преобразователь, применяя набор запросов comments.count().
Обратите внимание, что на языке шаблонов Django для вызова методов круглые скобки не используются. Тег {% with %} позволяет присваивать значение новой переменной, которая будет доступна в шаблоне до тех пор, пока не появится тег {% endwith %}.
Шаблонный тег {% with %} полезен тем, что он позволяет избегать многократного обращения к базе данных или к дорогостоящим методам.
Мы используем шаблонный фильтр pluralize, чтобы отображать суффикс множественного числа для слова comment, в зависимости от значения total_comments. Шаблонные фильтры на входе принимают значение переменной, к которой они применяются, и на выходе возвращают вычисленное значение.
Подробнее о шаблонных фильтрах мы узнаем далее, в разделе 6.8.
Шаблонный фильтр pluralize возвращает строковый литерал с буквой s, если значение отличается от 1. Приведенный выше текст будет прорисовываться как 0 comments, 1 comment или N comments, в зависимости от числа активных комментариев к посту.
Теперь давайте добавим список активных комментариев в шаблон детальной информации о посте.
Отредактируйте шаблон blog/post/detail.html, внеся в него следующие ниже изменения:
{% extends "blog/base.html" %}
{% block title %}{{ post.title }}{% endblock %}
{% block content %}
<h1>{{ post.title }}</h1>
<p class="date">
Published {{ post.publish }} by {{ post.author }}
</p>
{{ post.body|linebreaks }}
<p>
<a href="{% url 'blog:post_share' post.id %}">
Share this post
</a>
</p>
{% with comments.count as total_comments %}
<h2>
{{ total_comments }} comment{{ total_comments|pluralize }}
</h2>
{% endwith %}
{% 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.</p>
{% endfor %}
{% endblock %}
Мы добавили шаблонный тег {% for %}, чтобы прокручивать комментарии к посту в цикле. Если список комментариев пуст, то выводится сообщение, информирующее пользователей о том, что комментариев к этому посту нет.
Комментарии прокручиваются в цикле посредством переменной {{ forloop.counter }}, которая обновляет счетчик цикла на каждой итерации.
По каждому посту мы показываем имя пользователя, который его опубликовал, дату и текст комментария.
Наконец, давайте добавим форму комментария в шаблон.
Отредактируйте шаблон blog/post/detail.html, вставив шаблон комментарной формы, как показано ниже:
{% extends "blog/base.html" %}
{% block title %}{{ post.title }}{% endblock %}
{% block content %}
<h1>{{ post.title }}</h1>
<p class="date">
Published {{ post.publish }} by {{ post.author }}
</p>
{{ post.body|linebreaks }}
<p>
<a href="{% url 'blog:post_share' post.id %}">
Share this post
</a>
</p>
{% with comments.count as total_comments %}
<h2>
{{ total_comments }} comment{{ total_comments|pluralize }}
</h2>
{% endwith %}
{% 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.</p>
{% endfor %}
{% include "blog/post/includes/comment_form.html" %}
{% endblock %}
Пройдите по URL-адресу http://127.0.0.1:8000/blog/ в своем браузере и кликните по заголовку поста, чтобы взглянуть на страницу подробного описания поста:
Давайте протестируем, Заполните форму валидными данными и кликните по Add comment(Добавить комментарий). Вы должны увидеть следующую ниже страницу:
Кликните по ссылке Back to the post (Вернуться к посту). Вы должны быть перенаправлены обратно на страницу детальной информации о посте и увидеть комментарий, который вы только что добавили, как показано ниже:
Добавьте еще один комментарий в этот пост. Комментарии должны располагаться под содержимым поста в хронологическом порядке, как показано ниже:
Пройдите по URL-адресу http://127.0.0.1:8000/admin/blog/comment/ в своем браузере. Вы увидите страницу администрирования со списком созданных вами комментариев:
Кликните по заголовку одного из постов, чтобы его отредактировать. Снимите флажок Active (Активен), как показано ниже, и кликните по кнопке Save. Вы будете перенаправлены на список комментариев. В столбце Active отобразится неактивный значок комментария.
Если вернуться к представлению детальной информации о посте, то можно заметить, что неактивный комментарий больше не отображается и не учитывается при подсчете общего числа активных комментариев к посту:
Благодаря полю Active можно деактивировать неуместные комментарии и не показывать их в своих постах.