如何在Django中由管理员创建事件时如何通知用户?

时间:2013-03-02 16:55:22

标签: python django

我们目前正在为某个组织开发系统。其中一个要求是在管理员创建事件时通知用户。不应通过电子邮件通知所有网站用户,而应通知Facebook通知。如何在不使用Django通知,Django活动流等的情况下在Django中实现这样的功能。我们是Django的新手,我们希望尽可能简单地实现这样的功能。我希望你能帮助我们解决这个问题。谢谢你们!

2 个答案:

答案 0 :(得分:0)

所以,我真的只能给你一些大方向,因为我不知道具体细节,但基本上你可以这样做:

首先,我要为管理类的save_model()方法添加一个覆盖。您可以在此处查看您的对象是否还有主键。如果没有,您可以设置一个标志来创建事件(不确定是否还需要通过外键将事件与通知关联。

如果您不需要在事件和通知之间建立关联,则可以跳过设置标记,只需随时创建通知对象。

其次,创建一个为您的事件返回JSON的视图。我不确定你需要如何过滤这些对象。它仅适用于登录用户等,但您只想返回之前未查看过的用户。

第三,在一段时间内通过ajax调用视图,传递过滤结果所需的任何条件,并记录已查看的通知。

希望能让你前进。

答案 1 :(得分:0)

  

@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

OR。就像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字段。打开或关闭easyer。

NB!这段代码完全没有经过测试,可能会给出一些错误,但它可以让你朝着这个方向前进,我觉得这可能是你最好的选择。

艾伦