Как изменить значение поля, когда пользователь нажал кнопку уведомления

Я разрабатываю систему уведомлений на Django, в которой пользователи получают уведомления, когда кто-то комментирует статью, которую они разместили в приложении. Однако я столкнулся с проблемой, когда не могу изменить значение поля в модели уведомлений, когда пользователь нажимает на кнопку уведомления в шаблоне. Позвольте мне привести пример: Когда я задаю вопрос на Stack Overflow и кто-то комментирует его, я получаю уведомление о том, что кто-то прокомментировал мой вопрос. Когда я нажимаю на URL-адрес в шаблоне, красный значок исчезает, указывая на то, что автор вопроса уже прочитал комментарий к этому вопросу. Это именно та функциональность, которую я хочу реализовать здесь. Однако при использовании текущего метода в моем файле views.py метод возвращает ошибку, гласящую: 'int' object has no attribute 'is_read'.

def all_article(request):
    articles = Article.objects.all()
    notifications = Notification.objects.filter(user=request.user)

    unread_notifications = Notification.objects.filter(user=request.user, is_read=False).count()

    if unread_notifications.is_read == False:
        unread_notifications.is_read == True
        unread_notifications.save()
    return render(request, 'article.html', {"articles":articles, "notifications":notifications, "unread_notifications":unread_notifications})

models.py:

class Notification(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
    message = models.TextField()
    link = models.URLField(unique=True)
    is_read = models.BooleanField(default=False)
    created_at = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return str(self.user)

Шаблон:

<nav class="navbar navbar-light bg-light shadow-sm bg-body">
        <div class="container">
            <a class="navbar-brand" href="">
                <h5>Ex-Muslims of Northern Nigeria</h5>
            </a>
            <ul class="navbar-nav ms-auto flex-row">
                <li class="nav-item">
                    <div class="offcanvas offcanvas-top" tabindex="-1" id="offcanvasTop" aria-labelledby="offcanvasTopLabel">
                    <div class="offcanvas-header">
                        <h5 id="offcanvasTopLabel">Notifications</h5>
                        <button type="button" class="btn-close text-reset" data-bs-dismiss="offcanvas" aria-label="Close"></button>
                    </div>

                    <div class="offcanvas-body">
                        {% for notification in notifications reversed %}
                        <ul class="list-group my-2">
                            <a href="{{ notification.link }}">
                                <li class="list-group-item">
                                    {{ notification.message }}
                                </li>
                            </a>
                          </ul>
                          {% endfor %}
                    </div>
                    </div>

                </li>

            </ul>

            <ul class="navbar-nav ms-auto flex-row">

                <li class="nav-item me-3">
                    <a class="btn btn-light shadow-sm bg-body" href="{% url 'Post' %}">
                    Add
                </a>
                </li>

                <li class="nav-item me-3">
                    <a class="btn btn-light shadow-sm bg-body position-relative" href="" 
                    type="button" data-bs-toggle="offcanvas" data-bs-target="#offcanvasTop" 
                    aria-controls="offcanvasTop">
                    Notifications
                        {% if unread_notifications %}
                        <span class="position-absolute top-0 start-100 translate-middle badge rounded-pill bg-danger">
                            {{unread_notifications}}
                        </span>
                        {% endif %}
                    </a>
                </li>

                <li class="nav-item">
                    <a class="btn btn-light shadow-sm bg-body" href="{% url 'Profile' %}">
                    Profile
                </a>
                </li>

            </ul>

            
            
        </div>
    </nav>

По вашему мнению, у вас

unread_notifications = 
Notification.objects.filter(user=request.user, is_read=False).count()

С count() в конце, если есть 1 непрочитанное уведомление, unread_notifications будет равно 1. Это не будет объект непрочитанных уведомлений, поэтому у него не будет свойства is_read

Я подозреваю, что вы хотите:

unread_notifications = Notification.objects.filter(user=request.user, is_read=False)

for notification in unread_notifications:
    #We don't need this line as the filter guarantees is_read=False
    #if notification.is_read == False:
    notification.is_read == True
    notification .save()
Вернуться на верх