Как использовать django-уведомление, чтобы сообщить пользователю, когда кто-то комментирует его сообщение - PullRequest
11 голосов
/ 22 декабря 2011

Я уже некоторое время занимаюсь разработкой в ​​django и разработал удобный веб-сайт с такими функциями, как написание блогов, публикация вопросов, обмен контентом и т. Д. Однако по-прежнему отсутствует одна вещь, а именно создание уведомлений для пользователей.

То, что я хочу сделать, - это информировать пользователей в их профилях, когда кто-то комментирует их сообщения или если они следят за определенным сообщением и есть обновление, а затем информировать пользователя об этом обновлении.Я просмотрел много приложений, но я все еще очень озадачен тем, как это сделать.

В случае использования django-notification мне кажется (кажется, что это неправильно), что я могу использовать это только дляинформировать пользователя по электронной почте, то есть я не могу отобразить эти уведомления в профиле пользователя, как у нас на Facebook.

Во-первых, я хотел бы знать, если я не прав, а затем мне действительно нужен какой-то надлежащий учебник илируководство о том, как это сделать.Я знаю, как зарегистрировать уведомление и отправить его по правильному сигналу, но нет документации о том, как отображать эти уведомления в шаблоне, если это можно сделать.

Любое руководство / учебное пособие / начало работы будетглубоко признателен.

1 Ответ

12 голосов
/ 22 декабря 2011

Да, django-уведомления предназначены только для уведомлений по электронной почте.

Вот слот для сигналов, который вы можете добавить в файл models.py и настроить под свои нужды:

from django.db import models
from django.contrib.sites.models import Site
from django.db.models import signals
from notification import models as notification

def create_notice_types(app, created_models, verbosity, **kwargs):
    notification.create_notice_type("new_comment", "Comment posted", "A comment has been posted")
signals.post_syncdb.connect(create_notice_types, sender=notification)

def new_comment(sender, instance, created, **kwargs):
    # remove this if-block if you want notifications for comment edit too
    if not created:
        return None

    context = {
        'comment': instance,
        'site': Site.objects.get_current(),
    }
    recipients = []

    # add all users who commented the same object to recipients
    for comment in instance.__class__.objects.for_model(instance.content_object):
        if comment.user not in recipients and comment.user != instance.user:
            recipients.append(comment.user)

    # if the commented object is a user then notify him as well
    if isinstance(instance.content_object, models.get_model('auth', 'User')):
        # if he his the one who posts the comment then don't add him to recipients
        if instance.content_object != instance.user and instance.content_object not in recipients:
            recipients.append(instance.content_object)

    notification.send(recipients, 'new_comment', context)

signals.post_save.connect(new_comment, sender=models.get_model('comments', 'Comment'))

Теперь для шаблонов, довольно просто.

шаблоны / уведомление / new_comment / short.txt

{{ comment.user }} commented on {{ comment.object }}

шаблоны / уведомление / new_comment / notice.html

<a href="{{ comment.user.get_absolute_url }}">{{ comment.user }}</a> commented <a href="{{ comment.content_object.get_absolute_url }}">{{ comment.content_object }}</a>

Шаблоны / уведомление / new_comment / full.txt

{{ comment.user }} commented on {{ comment.content_object }}

Comment:
{{ comment.comment }}

Reply on: 
http://{{ site.domain }}{{ comment.content_object.get_absolute_url }}

Предупреждение: это очень упрощенная, непроверенная адаптация нашего производственного кода.

Примечание: Django-1.7 устарел сигнал post_syncdb

Вот еще немного информации:

...