Первоисточник:
Django’s comments framework Интерфейс комментариев в Джанго
¶ Джанго включает простой и легко настраиваемый интерфейс для управления комментариями. Этот встроенный интерфейс может быть использован для добавления комментариев к любой модели, поэтому вы можете использовать его для комментирования записей на блогах, фотографий, текстов или чего-нибудь еще.
ВАЖНО! Если вы привыкли использовать более старый (недокументированный) интерфейс комментариев, вам необходимо сделать обновление. Смотрите
upgrade guide для получения подробных инструкций.
БЫСТРЫЙ СТАРТ
Для успешного быстрого старта в использовании приложения comments, выполните следующие действия:
Инсталлируйте интерфейс комментариев путем добавления 'django.contrib.comments' в раздел INSTALLED_APPS.
Запустите manage.py syncdb, после чего Джанго создаст таблицы комментариев.
Добавьте ссылку на приложение comment в файле вашего проекта urls.py:
urlpatterns = patterns('',
...
(r'^comments/', include('django.contrib.comments.urls')),
...
)
Используйте comment template tags, расположенные внизу, для добавления комментариев в ваш шаблон.
Вы можете также изучить возможности
Comment settings.
Примечание перев.: мне также потребовалось добавить в файл views.py следующую строку:
from django.contrib.comments.models import Comment
Тэги комментариев для шаблонов
¶ Вы будете напрямую взаимодействовать с системой комментариев посредством соответствующих шаблонных тэгов, которые позволяют создавать комментарии и генерировать формы, посредством которых пользователи могут их отправлять на сайт.
Как и любую другую библиотекау шаблонных тэгов, вам необходимо загрузить ее перед началом использования (
load the custom tags):
{% load comments %}
Однажды загрузив, вы можете теперь везде использовать шаблонные тэги комментариев.
Определение объекта, к которому добавляются комментарии
¶Комментарии в Джанго всегда добавляются к какому-то родительскому объекту. Это может быть любая из множества возможных моделей Джанго. Каждый из тэгов позволяет определить родительский объект двумя различными способами:
1. Прямая ссылка на объект -- наиболее распространенный метод. В большинстве случаев вы будуте работать с вполне конкретными объектами в контексте шаблона, которые вы хотите прокомментировать, и вы можете сделать это довольно легко.
Например, в блоге на странице ввода, на которой имеется переменная entry, вы бы могли сделать следующее, чтобы загрузить данные о количестве комментариев:
{% get_comment_count for entry as comment_count %}.
2. Ссылка на объект посредством специального тэга content-type и идентификационного номера объекта.
Вы можете использовать этот метод, если по каким-то причинам у вас нет прямого доступа к объекту.
Например, вы знаете, что ID страницы равен 14, но не имеете к ней прямого доступа,
вы можете сделать что-то вроде этого:
{% get_comment_count for blog.entry 14 as comment_count %}
Здесь blog.entry - это метка приложения наименование модели (строчными буквами) базы данных.
Отображение комментариев
¶Для отображения списка комментариев, вы можете использовать шаблонные тэги
render_comment_list или
get_comment_list.
Быстрое отображение списка комментариевt
¶Наиболее простой путь отобразить список комментариев к конкретному объекту - это воспользоваться
render_comment_list:
{% render_comment_list for [object] %}
Например:
{% render_comment_list for event %}
Эта запись выведет комментарии, используя шаблон comments/list.html, версия которого
по умолчанию включена в Джанго.
Отображение обычного списка комментариев
¶Чтобы получить список комментариев для некоторого объекта, используйте
get_comment_list:
{% get_comment_list for [object] as [varname] %}
Например:
{% get_comment_list for event as comment_list %}
{% for comment in comment_list %}
...
{% endfor %}
Эта конструкция вернет список объектов
Comment. Смотрите
the comment model documentation для получения подробной информации.
Ссылки на комментарии
¶ Новое в Django 1.2:
Please, see the release notesДля получения постоянной ссылки на определенный комментарий, используйте
get_comment_permalink:
{% get_comment_permalink comment_obj [format_string] %}
По умолчанию именованный указатель, который связывает нас с адресом URL, содержит символ 'c',
который следует после ID комментария, например, 'c82. Вы можете переопределить этот строковый формат и таким образом изменить его поведение:
{% get_comment_permalink comment "#c%(id)s-by-%(user_name)s"%}
Формат строки - это стандартная фукнция форматирования строки в Питоне.
Соответствующие связующие ключи включают все атрибуты объекта комментания.
Вне зависимости от того, какой шаблон указателя вы определили, вы должны предложить
соответствуюший именованный указатель в нужном месте вашего шаблона.
Например:
{% for comment in comment_list %}
name="c{{ comment.id }}">
href="{% get_comment_permalink comment %}">
permalink for comment #{{ forloop.counter }}
...
{% endfor %}
ПРЕДУПРЕЖДЕНИЕ! Существует иизвестный баг (ошибка) в браузере Safari/Webkit
который игнорирует перенаправление непосредственно на комментарий. Практическое следствие выражается в том, что по ссылке попадаешь на нужную страницу, но внутри страницы браузер не прокручивает данные, чтобы выйти на нужный комментарий.
Подсчет комментариев
¶Чтобы подсчитать количество комментариев, добавленных к объекту, используйте
get_comment_count:
{% get_comment_count for [object] as [varname] %}
Например:
{% get_comment_count for event as comment_count %}
This event has {{ comment_count }} comments.
Отображение формы ввода комментариев
¶Чтобы отобразить форму, посредством которой пользователь вводит комментарии, вы можете воспользоваться
render_comment_form или
get_comment_form Быстрое отображение формы комментариев
¶Самый простой путь отобразить форму комментариев - воспользоваться
render_comment_form:
{% render_comment_form for [object] %}
Например:
{% render_comment_form for event %}
Эта зпись отразит комментарии с помощью встроенного шаблона comments/form.html, версия
по умолчанию которого входит в Джанго.
Отображение обычной формы комментариев
¶Если вы хотите предоставить пользователю больше графических инструментов при вводе комментария, вы можете воспользоваться
get_comment_form, чтобы получить
form object который вы можете использовать в шаблоне:
{% get_comment_form for [object] as [varname] %}
Полноценная форма может выглядеть так:
{% get_comment_form for event as form %}
action="{% comment_form_target %}" method="post">
{{ form }}
type="submit" name="preview" class="submit-post" value="Preview">
Советуаем вам прочитать раздел
notes on the comment form, чуть ниже, чтобы вы могли
ознакомиться с некоторыми особенностями, о которыз вам необходимо знать при использовании этого подхода.
Замечания к форме комментариев
¶ Форма, используемая для ввода комментариев, имеет ряд важных атрибутов, нацеленных на защиту от спама, о которых вам следует знать:
Форма содержит ряд скрытых полей, включая метку даты и времени (timestamps), информацию об объекте, к которому добавляется комментарий, и код безопасности (security hash), используемый для проверки (валидации) этой информации. Если кто-то нарушает целостность этих данных - например, при попытке размешения спама - комментарий будет отклонен системой.
Если вы используете обычную форму комментариев, то вам необходимо делать проверку, не были ли изменены эти данные.
Метка даты/времени испольщуеися для того, чтобы предотвращать длительные спамерские атаки. Комментарий пользователя, который вводится спустя слишком много времени после открытия страницы, будет отклонен.
Форма комментариев также включает в себя поле "honeypot". Это ловушка: если в это поле ввести какие-либо данные, то сообщение будет рассматриваться как спам (спамеры часто стараются автоматически заполнить все поля, чтобы преодолеть систему безопасности.
По умолчанию форма скрывает все эти поля с помощью CSS и в дальнейшем они дадут о себе знать лишь при получении сообщения об ошибке. Если вы используете обычную форму, то вам необходимо сделать то же самое.
Система комментариев также зависит от более общей системы защиты
Cross Site Request Forgery protection которая встроена в Django. Как описывается в документации, лучше всего использовать CsrfViewMiddleware. Однако если вы не используете это приложение, вам необходимо воспользоваться декоратором csrf_protect в каждом представлении которое включает форму комментариев чтобы можно было пользоваться CSRF-метками и cookie