如何使用django-notification发送保留发送者信息的匿名通知?
Django-Notification 匿名通知实现方案
问题说明
我已经实现了特定对象变更时发送通知的功能,代码如下:
notify.send(request.user, #UserA recipient=worker.profile.user, #UserB target=application, verb="Your object has been changed")
当前通知显示效果为:UserA: Your object Obj has been changed
我的需求是发送匿名通知——不显示发送者UserA的名称,仅展示Your object Obj has been changed,但要在后台保留发送者的相关信息。尝试过两种方法都没成功:
- 把sender字段设为None,但该字段要求非空;
- 设置actor字段,通知里还是会显示request.user的名称。
可行解决方案
1. 自定义通知渲染模板
django-notification的通知内容是通过模板渲染生成的,直接修改模板就能隐藏发送者信息:
- 在项目的
templates/notifications目录下创建/覆盖默认模板文件(比如notification.html) - 移除模板中渲染发送者(actor)的部分,示例模板片段:
{% if verb %} <strong>{{ verb }}</strong> {% if target %} <em>{{ target }}</em> {% endif %} {% endif %}
这样渲染后的通知就不会显示发送者名称,同时数据库里依然保留发送者的原始信息。
2. 用匿名用户实例作为发送者,额外存储真实发送者信息
创建一个未保存到数据库的匿名用户实例作为sender传入,同时把真实发送者的ID存入extra_data字段:
from django.contrib.auth.models import AnonymousUser # 创建匿名用户实例 anonymous_sender = AnonymousUser() # 把真实发送者ID存入额外数据字段 notify.send(anonymous_sender, recipient=worker.profile.user, target=application, verb="Your object has been changed", extra_data={"real_sender_id": request.user.id})
这种方式下通知不会显示发送者名称,后续需要追溯时,可通过extra_data里的ID查询到真实发送者。
3. 利用库的匿名配置参数
根据文档提到的字段支持匿名用法,尝试传入anonymous=True参数并将发送者设为None(如果库支持该参数):
notify.send(None, recipient=worker.profile.user, target=application, verb="Your object has been changed", anonymous=True, extra_data={"real_sender_id": request.user.id})
如果该参数生效,模板会自动跳过发送者的渲染,同时通过extra_data保留真实发送者的信息。
注意事项
- 自定义模板时,要确保模板路径能被django-notification识别,或者在调用
notify.send时通过template参数指定自定义模板; - 使用
AnonymousUser时,如果遇到属性缺失的错误,可以手动给实例添加必要属性(比如username设为空字符串); - 无论用哪种方法,都要通过
extra_data妥善存储真实发送者信息,方便后续业务追溯。
内容的提问来源于stack exchange,提问作者skypidoge
相关产品推荐
相关产品推荐

