如何正确地在Django中实现通知视图?

时间:2018-08-16 18:34:54

标签: python django python-3.x notifications

我已经在索引视图中实现了Django通知。但是我有更多视图,例如创建视图,更新视图,删除视图等。当用户首次登录我的应用程序时,我会显示通知和链接的数量,但是当用户切换到另一个视图时,通知数量将变为零。有什么办法可以在Django的每个视图中保留所有通知。这是我的views.py文件

pd.concat([df,diff],axis=1)

1 个答案:

答案 0 :(得分:2)

高档网站为此使用websockets / AJAX。但是,如果您只希望它在每次页面加载时更新,请使用Django上下文处理器。

上下文处理器是一种功能,每次在渲染模板时都会运行。因此,首先编写该函数。如果当前用户已登录,则此函数返回一个包含object_listnotificationcount的字典,否则将不返回任何内容。 / p>

def notification_context(request):
    if not request.user.is_anonymous:
        return {}

    query_list = Report_item.objects.all()
    query = request.GET.get('q', None)
    if query:
        query_list = query_list.filter(Q(title__icontains=query) |
                                   Q(item_type__icontains=query) |
                                   Q(city__icontains=query) |
                                   Q(location__icontains=query) |                                     Q(Description__icontains=query)).distinct()

    n = UserNotification.objects.filter(user=request.user, viewed=False)

    # you might want to use more unique names here, since these variables
    # will be in EVERY template
    return {
        'object_list': query_list,
        'notification': n,
        'count': n.count(),
    }

现在告诉django使用此处理器。在settings.py中,找到TEMPLATES部分,在OPTIONS下,您会看到context_processors。添加您的,例如:

TEMPLATES = [{
    'OPTIONS': {
        'context_processors': [
            'django.template.context_processors.debug',
            'django.template.context_processors.request',
            'django.contrib.auth.context_processors.auth',
            'django.contrib.messages.context_processors.messages',
            # fill in the correct appname.  Also, normally context processor functions go in 
            # context_processors.py, but if you only have one then it doesn't matter much.
            'your_appname.views.notification_context',
        ],
    },
},]

就是这样!现在,当用户登录后,您应该每次都在模板中获取变量。并且,如果您希望标题出现在显示这些变量的每个模板中,则应将标题放置在主站点模板中,然后所有其他模板都应扩展该模板。这样,您就不会重复将标题模板代码重复100次...

PS:我将再添加一个建议。与其直接返回变量,不如直接嵌套变量以避免嵌套模板名称空间。像这样:

return { 'notifications': {
        'object_list': query_list,
        'notification': n,
        'count': n.count(),
    }
}

然后,在您的模板中,它将如下所示:

{{ notification.count }}
{{ notification.query_list }}

等等等等。