首页 > 解决方案 > 如何让接收器在 Django 中监听用户特定的信号?

问题描述

我正在写一个 Django 博客站点,其中博客帖子需要经过管理员(超级用户)的批准才能发布。在我的 BlogPost 模型中,有一个布尔字段“已批准”。

我已经设法实现了所有这些。但是,我还希望在用户的帖子获得批准时通知用户(通过 django 消息)。(在管理员批准他们的帖子之前,用户可以在此期间做任何他们想做的事情,因此消息必须出现在用户当前所在的任何页面上。此外,如果用户在同时(例如,在不同的选项卡上),消息应该出现在所有选项卡上。)这就是我在实施时遇到的一些问题。我起草了一个小代码片段,它封装了我想要做的事情。

@receiver(post_save, sender=BlogPost)
def message_on_approve(sender, instance, **kwargs):
    if instance.user != (the current user who is logged in): return
    if instance.approved:
        messages.success((request, to be sent to the page user is currently on), 'Your post has been approved!')
    else:
        messages.error((the same request), 'Your post has not been approved.')

我现在面临两个问题。首先,由于我需要知道哪个用户登录了,代码片段似乎应该放在我的views.py中。但是,这意味着我无权访问当前登录的用户,除非我将其设为本地功能。第二个是我也不知道要为消息调用提出什么请求。

任何关于我如何进行这项工作的建议将不胜感激。谢谢!

标签: pythondjangodjango-viewsdjango-messages

解决方案


首先,您应该知道许多用户可能已登录并使用您的页面。如果你想找到导致这种变化的用户,你应该在你的模型中添加一个字段来记录你的视图函数中的用户 ID。

如果你想给一个作家用户发送通知,你应该在你的模型中添加一个新表并记录用户的通知,并添加 start_time 和 expire_time。例如,如果您的用户看到任何页面,您可以在此页面上显示未过期的通知。尽管更好的解决方案是使用套接字并在所有页面上与服务器通信。


推荐阅读