You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 17:10:32