Добавление комментариев в шаблон 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 можно отключить ненужные комментарии и избежать их отображения в ваших постах.

results matching ""

    No results matching ""