Django Получение данных из шаблона - PullRequest
0 голосов
/ 06 марта 2019

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

class Notification(models.Model):
    n_id = models.AutoField(primary_key=True)
    n_body = models.CharField(max_length=1000, null=True)
    n_recipient = models.ForeignKey(User, related_name='Recipient', on_delete=models.CASCADE)
    n_read_status = models.BooleanField(default=False)

Наш запрос будет Notification.objects.filter(n_recipient=request.user, n_read_status=False).count(), но мы не хотим вызывать его в каждом представлении вручную.

Ответы [ 2 ]

1 голос
/ 06 марта 2019

Как отметили @DanielRoseman и @ Navid2zp, правильным решением, вероятно, будет тег шаблона, который создается путем добавления папки templatetags ( дополнительная информация в Django docs ).Наш рабочий код ниже:

HTML-шаблон

{% load notifications %}
{{ messages|getmessages:request.user }}

notifications.py

from django import template
from Toolbox.models import Notification
from django.contrib.auth.models import User

register = template.Library()

@register.filter
def getmessages(value, user):
    number = Notification.objects.filter(n_recipient=user, n_read_status=False).count()
    return '' if number == 0 else ' (' + str(number) + ')'
1 голос
/ 06 марта 2019

Вы можете использовать 2 варианта:

1 - Использование тегов шаблона:

Пользовательские шаблоны тегов и фильтров

В основном вызывайте пользовательский тег шаблона с пользовательским объектом и получайте данные уведомления, когда вам это нужно.

2 - Использование промежуточного программного обеспечения django:

Django docs: Middleware

Добавьте данные вашего уведомления в контекст запроса. Пример здесь:

Django - Как изменить контекст шаблона из промежуточного программного обеспечения

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...