django-comments-xtd — это стороннее приложение для Django, которое значительно расширяет и улучшает возможности стандартного приложения django-contrib-comments
. Оно добавляет набор функций, которые часто ожидаются от современных систем комментирования, таких как древовидные комментарии, подтверждение по email, уведомления, возможность голосовать и REST API.
Важно: django-comments-xtd
ТРЕБУЕТ установки и настройки django-contrib-comments
. Оно строится поверх него, переопределяя и дополняя его классы и шаблоны.
Что добавляет django-comments-xtd:
- Древовидные (Threaded) комментарии: Позволяет отвечать на конкретные комментарии и создавать ветки обсуждений.
- Подтверждение комментария по Email: Для анонимных пользователей требуется подтвердить свой email, перейдя по ссылке в письме, прежде чем комментарий будет опубликован. Это помогает бороться со спамом и проверяет валидность email.
- Уведомления по Email: Пользователи могут получать уведомления о новых комментариях в ветке, на которую они ответили, или обо всех новых комментариях к комментируемому объекту (“follow-up”).
- Голосование за комментарии: Встроенная система для голосования (“лайки” / “дизлайки” / “апвоты” / “даунвоты”) комментариев.
- Встроенный REST API: Предоставляет набор конечных точек для взаимодействия с комментариями через JavaScript или другие клиенты, что идеально подходит для Single Page Applications (SPA).
- Дополнительная модерация: Расширяет возможности модерации, включая пороги для помеченных комментариев.
- Закрытие комментариев: Более гибкие возможности для закрытия обсуждения после определенного времени или по условию.
1. Установка
Поскольку django-comments-xtd
зависит от django-contrib-comments
, убедитесь, что последнее уже установлено и настроено (включая django.contrib.sites
и SITE_ID
).
-
Установите пакет:
pip install django-comments-xtd
-
Добавьте приложения в
settings.py
:В список
INSTALLED_APPS
, добавьтеdjango_comments_xtd
. ОЧЕНЬ ВАЖНО добавитьdjango_comments_xtd
передdjango_comments
. Это позволяетdjango-comments-xtd
переопределить необходимые файлы (например, шаблоны и URLConf) изdjango-contrib-comments
.# settings.py INSTALLED_APPS = [ # Обязательные для Django приложения 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'django.contrib.sites', # Приложение комментариев XTD (ДО django_comments) 'django_comments_xtd', # <--- Добавляем перед django_comments # Базовое приложение комментариев (ОБЯЗАТЕЛЬНО) 'django_comments', # <--- Добавляем после django_comments_xtd # Ваше приложение с моделями 'your_app_name', # ... другие приложения ] # Убедитесь, что SITE_ID настроен SITE_ID = 1 # ... другие настройки
2. Конфигурация (settings.py)
django-comments-xtd
имеет множество настроек для управления его поведением. Вот некоторые ключевые:
-
COMMENTS_APP = 'django_comments_xtd'
:- Это самая важная настройка. Она указывает Django использовать модели, формы и представления из
django_comments_xtd
вместо стандартных изdjango_comments
. - Добавьте эту строку в
settings.py
.
# settings.py COMMENTS_APP = 'django_comments_xtd'
- Это самая важная настройка. Она указывает Django использовать модели, формы и представления из
-
Настройка Email Backend:
- Для функций подтверждения по email и уведомлений требуется настроенный почтовый бэкенд.
- В режиме разработки часто используют
console.EmailBackend
(выводит письма в консоль) илиfilebased.EmailBackend
(сохраняет письма в файл). - В продакшене используйте реальный SMTP-бэкенд (
smtp.EmailBackend
) или сторонние сервисы.
# settings.py (Пример для вывода писем в консоль) EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend' # settings.py (Пример для сохранения писем в директорию 'emails' в корне проекта) # EMAIL_BACKEND = 'django.core.mail.backends.filebased.EmailBackend' # EMAIL_FILE_PATH = BASE_DIR / 'emails' # Убедитесь, что директория существует и доступна для записи # settings.py (Пример для SMTP - требуется реальный SMTP-сервер) # EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend' # EMAIL_HOST = 'smtp.your_server.com' # EMAIL_PORT = 587 # EMAIL_USE_TLS = True # EMAIL_HOST_USER = 'your_email@your_server.com' # EMAIL_HOST_PASSWORD = 'your_email_password'
-
COMMENT_EMAIL_NOTIFICATION = True
:- Включает отправку email-уведомлений о новых комментариях/ответах. По умолчанию
False
.
- Включает отправку email-уведомлений о новых комментариях/ответах. По умолчанию
-
COMMENT_APPROVAL_REQUIRED = False
:- Если
True
, первый комментарий в каждой новой ветке (не ответ на существующий комментарий) будет требовать модерации перед публикацией. После одобрения первым постом в ветке, остальные ответы в этой ветке (если они не ответы на одобренный первый пост) могут публиковаться сразу. - По умолчанию
False
.
- Если
-
COMMENTS_XTD_CONFIRM_EMAIL = True
:- Включает функцию подтверждения email для анонимных комментариев. По умолчанию
True
. ЕслиFalse
, анонимные комментарии публикуются сразу (если модерация не требуется).
- Включает функцию подтверждения email для анонимных комментариев. По умолчанию
-
COMMENTS_XTD_MAX_THREAD_DEPTH = 0
:- Максимальная глубина ветки комментариев.
0
означает неограниченную глубину. Установите, например,3
для ограничения веток тремя уровнями вложенности.
- Максимальная глубина ветки комментариев.
-
COMMENTS_XTD_ALLOW_ANONYMOUS = True
:- Управляет тем, могут ли анонимные пользователи оставлять комментарии. Наследуется от
django-contrib-comments
, но стоит убедиться. По умолчаниюTrue
.
- Управляет тем, могут ли анонимные пользователи оставлять комментарии. Наследуется от
-
COMMENTS_XTD_SALT
:- Секретная строка (соль), используемая при формировании ссылки подтверждения email. Установите её как случайную уникальную строку, отличную от
SECRET_KEY
. Если не указана, используетсяSECRET_KEY
. Рекомендуется использовать отдельную соль.
# settings.py COMMENTS_XTD_SALT = "ваша_случайная_строка_соли"
- Секретная строка (соль), используемая при формировании ссылки подтверждения email. Установите её как случайную уникальную строку, отличную от
-
Множество других настроек для управления голосованием, модерацией, пагинацией API и т.д. См. официальную документацию.
3. Настройка базы данных (Миграции)
После добавления django_comments_xtd
и установки COMMENTS_APP = 'django_comments_xtd'
, запустите миграции.
python manage.py migrate
Эта команда:
- Применит миграции для
django_comments_xtd
, которые создают новую модельXtdComment
и связанные таблицы (например, для подписок, голосов). - Может внести изменения в таблицу
django_comments
или другие связанные таблицы, чтобы учесть новые поля и логикуxtd
.
Модель XtdComment
наследуется от Comment
(django_comments.models.Comment
) и добавляет поля для реализации ветвления (parent_id
, thread_id
, level
, order
) и другие поля для функций xtd
(например, followup
).
4. Интеграция с вашей моделью (Представления и Шаблоны)
Интеграция с вашей моделью происходит точно так же, как и с django-contrib-comments
, но благодаря тому, что django-comments-xtd
переопределяет теги шаблона и URLConf, вы автоматически получаете расширенный функционал.
-
Представление: Ваше представление (DetailView или FBV) должно просто передать объект, который вы хотите комментировать, в контекст шаблона.
# your_app/views.py from django.views.generic import DetailView from .models import YourModel class YourModelDetailView(DetailView): model = YourModel template_name = 'your_app/yourmodel_detail.html' context_object_name = 'object' # Или любое другое имя
-
Шаблон: Используйте те же самые теги шаблона
{% load comments %}
,{% render_comment_list %}
и{% render_comment_form %}
.{# your_app/yourmodel_detail.html #} {% extends 'base.html' %} {% load comments %} {# Загружаем теги комментариев (они переопределены в xtd) #} {% load comments_xtd %} {# Также загрузите xtd-специфичные теги, если планируете их использовать (например, для голосования) #} {% block content %} <h1>{{ object.title }}</h1> <p>{{ object.body }}</p> {# Оставьте <h2>Комментарии</h2> здесь или в шаблоне list.html #} {# Отображает древовидный список комментариев #} {% render_comment_list for object %} {# Отображает форму комментария (с полем для подписки на уведомления) #} {% render_comment_form for object %} {% endblock %}
{% load comments_xtd %}
: Необходим для использования тегов, специфичных только дляdjango-comments-xtd
, например, для отображения формы голосования. Хотя{% render_comment_list %}
уже включает логику отображения голосов в стандартном шаблонеxtd
.
5. Ключевые функции и их интеграция
5.1 Древовидные комментарии
- Реализованы автоматически в
XtdComment
с помощью полейparent_id
,thread_id
,level
,order
. - Тег
{% render_comment_list %}
, переопределенныйdjango-comments-xtd
, рендерит комментарии с правильной вложенностью, используя шаблонdjango_comments_xtd/comment_list.html
, который, в свою очередь, обычно включает рендеринг каждого отдельного комментария с помощью шаблонаdjango_comments_xtd/comment.html
. - Форма комментария (
{% render_comment_form %}
) в шаблонеdjango_comments_xtd/comment_form.html
содержит скрытые поля, которые заполняются JavaScript’ом для указания, является ли комментарий ответом на другой комментарий.
5.2 Подтверждение по Email (для анонимов)
- Когда анонимный пользователь отправляет комментарий (
POST
запрос на URL/comments/post/
), он не публикуется сразу. - Django отправляет письмо на указанный email адрес (используя настроенный
EMAIL_BACKEND
). - Пользователь должен перейти по ссылке в письме, которая ведет на URL вроде
/comments/confirm/[key]/
. - Представление
django-comments-xtd
обрабатывает этот URL, находит “удерживаемый” комментарий и публикует его (is_public = True
). - Пользователи, прошедшие аутентификацию, публикуют комментарии сразу (если модерация не требуется).
- Поведение управляется настройкой
COMMENTS_XTD_CONFIRM_EMAIL = True/False
.
5.3 Уведомления по Email
- В стандартном шаблоне формы (
django_comments_xtd/comment_form.html
) есть чекбокс “Notify me of follow up comments” (Уведомлять меня о новых комментариях). Этот чекбокс доступен только еслиCOMMENT_EMAIL_NOTIFICATION = True
и пользователь либо аутентифицирован, либоCOMMENTS_XTD_CONFIRM_EMAIL = True
(чтобы убедиться в валидности email). - Когда новый комментарий или ответ публикуется, Django отправляет письмо всем пользователям, подписанным на уведомления для этого объекта/ветки.
- В шаблоне списка комментариев (
django_comments_xtd/comment.html
) есть ссылка “follow” для подписки на конкретную ветку и “unfollow” для отписки. - Работает только если
COMMENT_EMAIL_NOTIFICATION = True
и настроенEMAIL_BACKEND
.
5.4 Голосование
-
Стандартный шаблон
django_comments_xtd/comment.html
включает блоки для отображения текущего счета голосов (лайков/дизлайков) и кнопок для голосования. -
Функциональность голосования реализована через REST API. Нажатие на кнопки вызывает JavaScript, который отправляет
POST
запрос на URL вроде/comments/api/comments/N/vote/
, гдеN
- ID комментария. -
Вам, возможно, потребуется включить JavaScript и CSS файлы, предоставляемые
django-comments-xtd
в ваших базовых шаблонах, чтобы голосование и другие интерактивные элементы работали:{# base.html или ваш главный шаблон #} {% load static %} <script src="{% static 'django_comments_xtd/js/jquery.js' %}"></script> {# django-comments-xtd может требовать jQuery #} <script src="{% static 'django_comments_xtd/js/jquery.form.js' %}"></script> <script src="{% static 'django_comments_xtd/js/jquery.cookie.js' %}"></script> <script src="{% static 'django_comments_xtd/js/django_comments_xtd.js' %}"></script> <link rel="stylesheet" href="{% static 'django_comments_xtd/css/bootstrap3/django-comments-xtd.css' %}"> {# Пример для Bootstrap 3 #} {# Выберите подходящий файл CSS в зависимости от используемого CSS-фреймворка или используйте base/ #}
- Внимание:
django-comments-xtd
исторически полагался на jQuery. В зависимости от версии и ваших предпочтений, возможно, потребуется предоставить jQuery или переписать JavaScript-логику. Проверьте актуальную документацию.
- Внимание:
5.5 REST API
django-comments-xtd
предоставляет viewsets и роутеры для Django REST framework.- После подключения
django_comments_xtd.urls
в вашемurls.py
, становятся доступны эндпоинты:/comments/api/comments/
: GET (список), POST (создание комментария)/comments/api/comments/<pk>/
: GET (один комментарий), PUT/PATCH (обновление), DELETE (удаление)/comments/api/comments/<pk>/vote/
: POST (голосование)/comments/api/comments/<pk>/flag/
: POST (пометить комментарий)
- Это позволяет легко интегрировать систему комментариев с фронтендом, написанным на JavaScript-фреймворках (React, Vue, Angular) или с мобильными приложениями.
6. Кастомизация
Как и django-contrib-comments
, django-comments-xtd
позволяет кастомизировать шаблоны и формы.
6.1 Кастомизация шаблонов
Это основной способ изменения внешнего вида. Создайте директорию templates/django_comments_xtd/
в вашем проекте или приложении и поместите туда переопределенные файлы.
Ключевые шаблоны:
django_comments_xtd/comment_list.html
: Основной шаблон для рендеринга всего списка комментариев (обычно вызываетcomment.html
для каждого комментария).django_comments_xtd/comment.html
: Шаблон для рендеринга одного комментария в списке, включая его вложенность, автора, текст, кнопки голосования и ссылку “ответить”.django_comments_xtd/comment_form.html
: Шаблон формы для добавления нового комментария (включает поля автора/email/URL для анонимов, поле текста, чекбокс подписки).django_comments_xtd/reply.html
: Шаблон для AJAX-ответов формы (когда форма ответа показывается под конкретным комментарием).django_comments_xtd/email/
: Директория с шаблонами писем для подтверждения и уведомлений.
6.2 Кастомизация формы
Наследуйте от django_comments_xtd.forms.XtdCommentForm
и добавьте свои поля или валидацию.
# your_app/forms.py
from django_comments_xtd.forms import XtdCommentForm
from django import forms
class MyXtdCommentForm(XtdCommentForm):
# Пример: сделать поле URL необязательным для анонимов
user_url = forms.URLField(required=False, label="Сайт (необязательно)")
# Пример: добавить поле выбора настроения
MOOD_CHOICES = [
('happy', '😊 Счастлив'),
('neutral', '😐 Нейтрально'),
('sad', '😔 Грустно'),
]
mood = forms.ChoiceField(choices=MOOD_CHOICES, required=False, label="Ваше настроение")
def get_comment_create_data(self, site_id=None):
# Переопределите, чтобы включить новые данные в объект комментария
data = super().get_comment_create_data(site_id)
data['mood'] = self.cleaned_data['mood']
# Если вы добавили поле в модель XtdComment, оно будет сохранено автоматически
# при использовании COMMENTS_APP. Если нет, вам нужно кастомизировать модель.
return data
Чтобы использовать вашу кастомную форму, укажите её в settings.py
:
# settings.py
COMMENTS_XTD_FORM_CLASS = 'your_app.forms.MyXtdCommentForm'
6.3 Кастомизация модели
Если вам нужно добавить поля, которые будут храниться в базе данных комментариев (т.е., поля, которых нет в стандартной XtdComment
), вам придется создать свою собственную модель, наследуя её от XtdComment
.
# your_app/models.py
from django_comments_xtd.models import XtdComment
from django.db import models
class MyCommentWithMood(XtdComment):
# Добавьте новое поле, которое вы, возможно, добавили в форму выше
mood = models.CharField(max_length=10, blank=True, null=True) # Пример
# Django требует определения objects Manager для кастомных моделей, наследующих от XtdComment
objects = XtdComment.objects
class Meta:
proxy = True # Если вы только добавляете методы или изменяете менеджер, используйте прокси
# Если вы добавляете поля (как mood выше), proxy=False (или уберите эту строку) и нужна новая таблица
# Тогда это будет модель с multi-table inheritance.
Если вы добавляете поля, Django создаст новую таблицу, связанную с таблицей XtdComment
. Вам нужно будет создать и применить миграции для этого.
Чтобы Django использовал вашу кастомную модель и вашу кастомную форму, убедитесь, что в settings.py
:
# settings.py
COMMENTS_APP = 'your_app' # Указывает Django использовать модели и формы из вашего приложения
# COMMENTS_XTD_FORM_CLASS не нужен, если COMMENTS_APP указывает на ваше приложение с формой
7. Заключение
django-comments-xtd
— это мощное расширение для django-contrib-comments
, которое предоставляет большинство функций, необходимых для современных систем комментирования. Оно хорошо спроектировано, активно поддерживается и относительно просто интегрируется, особенно если вы уже используете Class-Based Views и ModelForms. Кастомизация в основном сводится к переопределению шаблонов и, при необходимости, форм и модели. Всегда обращайтесь к официальной документации django-comments-xtd за самой актуальной информацией и полным списком настроек.
〰〰〰 𓆝 𓆟 𓆞 𓆝 𓆟 𓆝 𓆟 𓆞 〰〰〰