Как изменить значение поля, когда пользователь нажал кнопку уведомления
Я разрабатываю систему уведомлений на 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()