Как установить уведомления о новых комментариях для всех страниц в django?

#python #django

#python #django

Вопрос:

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

Models.py

 class Alert(models.Model):
    sender = models.ForeignKey(UserProfile, on_delete=models.CASCADE, related_name="sender_userprofile", verbose_name="Sender")
    receivers = models.ForeignKey(UserProfile, on_delete=models.CASCADE, related_name="receivers_userprofile", verbose_name="Receiver")
    timestamp = models.DateTimeField("Created Time", auto_now_add=True)
    is_read = models.BooleanField('Is read', default=False)
    belong_cmt2mess = models.ForeignKey(CommentToMessage, on_delete=models.CASCADE, related_name="belong_and_mess",verbose_name="Comments belonged")

    class Meta:
        verbose_name = 'Notifications'
        verbose_name_plural = verbose_name
        ordering = ['-timestamp']

    def mark_read(self):
        self.is_read = True
        self.save(update_fields=['is_read'])

@receiver(post_save, sender=CommentToMessage)
def create_msg_handler(sender, instance, **kwargs):
    b_mess = instance.tar_mess
    sender = instance.com_nicknames
    receivers = instance.tar_mess.message_nicknames
    msg = Alert(sender=sender, belong_mess=b_mess, receivers=receivers, belong_cmt2mess=instance)
    msg.save()
  

Ответ №1:

Если вы хотите сделать что-то доступным для каждого запроса, вы можете написать контекстный процессор. Эти функции дополняют контекст для каждого запроса, так что вы можете получить доступ к вещам везде.

Эти функции могут быть действительно простыми, например;

 def release_number(request):
    """
    Add the release number (version) to the context
    """
    return {
        'RELEASE_NUMBER': settings.RELEASE_NUMBER,
    }
  

Им просто нужно вернуть словарь, похожий на любой обычный контекст из представления. Таким образом, вы могли бы использовать одно из них для запроса вашей Alert модели и получения уведомлений.

Чтобы добавить одно из них, вы добавляете пунктирный путь к своей функции в TEMPLATES параметры настройки, как показано ниже;

 TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': (
            os.path.join(PROJECT_DIR, 'templates'),
        ),
        'APP_DIRS': False,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
            'loaders': [
                'django.template.loaders.filesystem.Loader',
                'django.template.loaders.app_directories.Loader',
            ],
        },
    },
]
  

Некоторые связанные документы здесь; https://docs.djangoproject.com/en/3.1/ref/templates/api/#using-requestcontext