понедельник, 21 ноября 2011 г.

Django: кастомизируем форму комментариев от django-comments


DJANGO-фреймворк включает в себя встроенный механизм комментирования контента произвольного типа. Довольно удобная штука. Имеет даже встроенные механизмы борьбы со спамом, модерацией, удобный интерфейс администрирования... Но, как и любое коробочное решение , рано или поздно требует доводки.
В моем случае не потребовалось писать кастомное приложение с наследованием классов встроенных комментариев - надо было лишь изменить интерфейс формы комментария.
Вот, что надо сделать, чтобы отрисовать свою форму:

1. включить шаблонный тег: {%load comments%} в самую "верхушку" шаблона страницы, откуда будет приниматься комментарий пользователя
2. в том месте, где будет показываться форма , поместить шаблонный тег: {% render_comment_form for entry%}
3. в основной директории для хранения шаблонов создать подкаталог 'comments' и поместить в него файл form.html , который будет, например с таким содержанием:

{% if user.is_authenticated %}
<form action="/comments/post/" method="post">
{%csrf_token%}
<textarea name="comment" id="id_comment" rows="2" style="width: 90%;"></textarea>
<input type="submit" name="post" value="Add">
{% for hidden in form.hidden_fields %}
{{ hidden }}
{% endfor %}
</form>
{% else %}
<p class="red big">авторизуйтесь!<br>только зарегистрированные пользователи могут оставлять комментарии.</p>
{% endif %}

Инструкция 'if user.is_authenticated' необязательна - Вы можете и разрешить комментарии для неавторизованных пользователей (вы можете даже вообще не использовать встроенный механизм авторизации =)

Тег {%csrf_token%} также не имеет никакого отношения к топику, но для полноты картины оставил и его.

Далее идет html-код моей формы, в которой от кучи "коробочных" полей , я оставил только текст комментария. Остальное мне не нужно было. Автор комментария (а это будет id - авторизованного пользователя) проставится в соответствующее поле самим приложением comments.

Шаблонный цикл, вставляющий некие hidden-поля ОБЯЗАТЕЛЕН - без этих самых полей засабмитить форму не получится. Для понимания: в скрытых полях , которые я добавил таким образом, передаются тип контента (ContentType), идентификатор объекта (ForeignKey), которому относится комментарий и еще поле для защиты от спама, которое не-бот никогда не увидит и не заполнит, а вот тупой бот может и перемудрить, отправив заполненным и его =)

С удалением полей просто. Но следует понимать, что ДОБАВЛЯЯ свои собственные поля, надо не забыить НАУЧИТЬ понимать и принимать эти поля само приложение. Правильнее всего в этом случае написать свое кастомное приложение для комментирования. Об этом неплохо написано на djangoproject.com - копипастить уже написанное смысла не вижу :)

Комментариев нет:

Отправить комментарий

Если Вы нашли ошибку у автора, у Вас есть вопрос или просто хотите поделиться чем-то полезным, то пишите - не стесняйтесь..