Django, отображать количество непрочитанных сообщений в базовом шаблоне

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

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

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

2 ответа

Решение

Вы можете написать простой тег, который может сделать это для вас.

def unread_messages(user):
    return user.messages_set.filter(read=False).count()
    #replace the messages_set with the appropriate related_name, and also the filter field. (I am assuming it to be "read")

register.simple_tag(unread_messages)

и в базовом шаблоне:

{% load <yourtemplatetagname> %}

{% if request.user.is_authenticated %}
    {{ request.user|unread_messages }}
{% endif %}

Простой тег должен быть для вас самым простым решением. Это решение помогло мне и основано на документации Django.

Используйте следующую структуру папок в своем приложении.

      user_app/
    __init__.py
    models.py
    templates/
        user_app/
            base.html
            ...
    templatetags/
        __init__.py
        user_tags.py
    views.py
    ...

В рамкахuser_tags.py

      from django import template
from user_app.models import Notification

register = template.Library()

@register.simple_tag(takes_context=True)
def get_unread_messages_count(context):
    return Notification.objects.filter(recipient=context["request"].user, read=False).count()

В пределахbase.html

      
{% load user_tags %}

...



<a href="{% url 'messages' %}">
   Messages <span class="badge rounded-pill text-bg-danger">{% get_unread_messages_count %}</span>
</a>


Конечно, вам необходимо реализовать свои собственные стили и классы для вашего конкретного проекта. Я использую значки-таблетки Bootstrap 5.3 .

Другие вопросы по тегам