我们目前正在为某个组织开发系统。其中一个要求是在管理员创建事件时通知用户。不应通过电子邮件通知所有网站用户,而应通知Facebook通知。如何在不使用Django通知,Django活动流等的情况下在Django中实现这样的功能。我们是Django的新手,我们希望尽可能简单地实现这样的功能。我希望你能帮助我们解决这个问题。谢谢你们!
答案 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!这段代码完全没有经过测试,可能会给出一些错误,但它可以让你朝着这个方向前进,我觉得这可能是你最好的选择。
艾伦