Урок 15 / 22 · Commentail 1.3.2
Для данных, которых нет в обычных настройках, у Commentail есть callbacks — функции вашего проекта, вызываемые библиотекой. В конфигурации указывается строка импорта, а не результат вызова функции.
Имена и аватары
Создайте myproject/comments.py, заменив myproject настоящим импортируемым пакетом сайта:
def get_author_name(user, request):
"""Use the account's chosen full name, then its login name."""
return user.get_full_name().strip() or user.get_username()
def get_avatar(context, request):
"""Read the host project's optional profile avatar."""
if context.user is None:
return None
profile = getattr(context.user, "profile", None)
image = getattr(profile, "avatar", None)
return image.url if image else None
def get_comment_templates(page, request):
"""Declare the actual dynamic include used by the host Page template."""
return ["articles/discussion.html"]
Этот пример имени рассчитан на User с методами get_full_name() и get_username(). Аватар предполагает существующий profile.avatar; собственного профиля код не создаёт. Если поле у вас иначе называется, адаптируйте его. Не добавляйте удалённый HTTP-запрос при отрисовке каждого комментария.
COMMENTAIL = {
"default": {
"GET_AUTHOR_NAME": "myproject.comments.get_author_name",
"GET_AVATAR": "myproject.comments.get_avatar",
"GET_COMMENT_TEMPLATES": "myproject.comments.get_comment_templates",
},
}
Функция имени меняет отображение зарегистрированного автора; имя гостя сохраняется таким, каким он его отправил. Avatar context содержит id, display_name, user, site и target, но не адрес гостя. Возврат None сохраняет инициалы; сбой callback даёт штатный fallback, а не разрешение скрывать исключения в своём коде.
Когда нужен GET_COMMENT_TEMPLATES
Третья функция нужна только когда Page выбирает шаблон обсуждения динамически и библиотека не может обнаружить зависимость обычным способом. Создайте реальный templates/articles/discussion.html с {% load commentail_tags %} и {% commentail page %}, а затем действительно включайте его из Page. Одна функция виджет не добавляет. Если динамики нет, удалите эту функцию и её настройку из примера.
Доступ к гостевой почте без браузера
CAN_SEND_GUEST_EMAIL(recipient, target, site) проверяет право получателя, когда обработчик не имеет его браузерной сессии. Для обычной общедоступной Wagtail Page особый callback не нужен. Для закрытой страницы нужно доказать конкретное право — например, действующую подписку по вашей модели данных. Не возвращайте безусловный True. Для обычных Django-объектов конкретный рабочий пример приведён в уроке 17.
Если нужен свой CAPTCHA backend
У класса без аргументов конструктора два метода: create(request, site) возвращает CaptchaTask из commentail.security, verify(request, site, challenge_id, answer) — bool. В задаче есть строковый id до 255 символов, имя шаблона и словарь публичных строк data. Решение и секреты остаются на сервере; шаблон отправляет поле answer.
Библиотека связывает задачу с браузером и Site, проверяет срок, попытки и одноразовость. Backend сам обслуживает дополнительное приватное состояние и его очистку. Используйте этот путь при существующем проверяемом провайдере; учебная функция «всегда True» отключила бы защиту, поэтому готового псевдобэкенда здесь нет. Точный контракт и ограничения нужны перед собственной реализацией.
Другие уроки по этой задаче
- 13. Меняем шаблоны и страницы подтверждения
- 16. Два языка и несколько сайтов
- 17. Комментарии к товарам и другим Django-моделям
Выберите способ входа или оставьте комментарий как гость ниже.