Django通知系统问题:点击通知按钮无法修改is_read字段
Django通知系统标记已读问题解决
错误原因
你在views.py里用了Notification.objects.filter(...).count(),这个方法返回的是未读通知的数量(整数),不是Notification对象实例,所以调用unread_notifications.is_read会报错'int' object has no attribute 'is_read'。同时你的逻辑不符合需求——当前代码是进入文章列表页就试图标记所有未读为已读,但实际需要的是点击单个通知链接后,才标记对应通知为已读。
解决方案
1. 添加标记已读的视图和URL
首先在urls.py中添加处理标记已读的URL规则:
from django.urls import path from . import views urlpatterns = [ # 保留你原有其他URL... path('notification/read/<int:notification_id>/', views.mark_notification_read, name='mark_notification_read'), path('articles/', views.all_article, name='all_article'), ]
然后在views.py中实现标记已读的视图,并修正原视图的错误代码:
from django.shortcuts import get_object_or_404, redirect from .models import Notification, Article def mark_notification_read(request, notification_id): # 获取当前用户的对应通知,不存在则返回404页面 notification = get_object_or_404(Notification, id=notification_id, user=request.user) if not notification.is_read: notification.is_read = True notification.save() # 标记完成后跳转到通知指向的目标页面 return redirect(notification.link) 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判断及save代码 return render(request, 'article.html', {"articles":articles, "notifications":notifications, "unread_notifications":unread_notifications})
2. 修改模板中的通知链接
把模板里直接跳转到目标地址的链接,改成先经过标记已读的视图:
<!-- 替换原有的<a href="{{ notification.link }}">代码 --> <a href="{% url 'mark_notification_read' notification.id %}"> <li class="list-group-item"> {{ notification.message }} </li> </a>
效果说明
用户点击通知链接时,会先触发mark_notification_read视图,将该通知标记为已读,随后自动跳转到通知对应的目标页面。导航栏的红色未读徽章会根据unread_notifications的实时计数自动更新。
内容的提问来源于stack exchange,提问作者Bubble
相关产品推荐
相关产品推荐

