我们目前正在为某个组织开发一个系统。其中一项要求是在管理员创建事件时通知用户。不应通过电子邮件通知所有站点用户,而应通过类似于 Facebook 通知的方式通知所有站点用户。如何在不使用 Django 通知、Django 活动流等的情况下在 Django 中实现此类功能。我们是 Django 的新手,我们希望尽可能简单地实现此类功能。我希望你能帮助我们解决这个问题。谢谢你们!
2 回答
@Zayatzz 我们计划通知用户一次。但在用户查看通知后,他/她仍然可以稍后查看。
在这种情况下,您可能需要在管理员中创建通知对象。对象可能需要是这样的:
class Notification(models.Model):
message = models.TextField()
type = models.IntegerField()
relevancy_end_date = models.DateField()
notified_users = models.ManyToManyField(django.contrib.auth.User, null = True)
在您的管理表单中,您需要覆盖该 models.IntegerField 以获得带有选择的小部件。您可以从中获得的选择:
https://docs.djangoproject.com/en/dev/ref/contrib/messages/#creating-custom-message-levels
它们基本上是数字,10、20、30、40、50。
在视图中,您可以检查是否有应通知用户的通知:
notes = Notification.objects.filter(notified_users__id = request.user.id).filter(relevancy_end_date__gte = datetime.datetime.now())
如果有任何通知,请使用 djanogs 自己的消息框架创建消息:
from django.contrib import messages
if notes:
for note in notes:
messages.add_message(request, note.type, 'Hello world.')
note.notified_users.add(request.user)
它是什么类型的消息(信息、错误、成功)保存在您的通知类型列中。所以是的 - 你需要在那里添加某种检查,根据通知类型改变消息类型。
将该块写入要显示消息的每个视图的开头并不是很干。因此,您应该为此创建自己的视图装饰器。
这两个链接应该可以帮助您做到这一点: https://docs.djangoproject.com/en/dev/topics/http/decorators/ How create decorator in Django for decorating view
现在在这一点上。如果有消息需要通知用户 - 它在由消息框架处理的请求中。要在视图中显示它,您需要这样做: https ://docs.djangoproject.com/en/dev/ref/contrib/messages/#displaying-messages
或者。就像 Brandon 说的那样——如果您还希望通过 ajax/json 调用传递消息,那么您需要“手动”处理它们并将它们插入到 json 响应中。像这样的东西:
https://docs.djangoproject.com/en/dev/ref/contrib/messages/#expiration-of-messages
from django.utils import simplejson
feedback = messages.get_messages(request)
for message in feedback:
response[message.tags] = response.get(message.tags, [])
message_text = smart_str(message.message, encoding='utf-8', strings_only=True)
response[message.tags].append(message_text)
return simplejson.dumps(response)
拥有 Notification 对象后,拥有视图装饰器,然后您只需要创建一个视图来向用户显示他已显示的通知。我相信您可以弄清楚如何创建该查询。
您还可以调整此 Notification 类以使用额外的布尔字段或 relevancy_end_date 字段。使打开或关闭它更容易。
注意!这段代码完全未经测试,可能会给出一些错误,但它能让你朝着正确的方向前进,我认为根据你的输入判断,这可能最适合你。
艾伦
所以,我真的只能给你一些大致的方向,因为我不知道细节,但基本上你可以做这样的事情:
首先,我会为您的管理类的 save_model() 方法添加一个覆盖。在这里您可以检查您的对象是否有主键。如果没有,您可以设置一个标志来创建事件(不确定您是否还需要通过外键将您的事件与通知相关联。
如果您不需要在事件和通知之间建立关联,则可以跳过设置标志,只需在需要时创建通知对象。
其次,创建一个为您的事件返回 JSON 的视图。我不确定您需要如何过滤这些对象。是否仅适用于登录用户等,但您只想返回以前未查看过的用户。
第三,通过 ajax 在间隔内调用视图,传入过滤结果并记录已查看通知所需的任何标准。
希望这能让你继续前进。