我已经在索引视图中实现了Django通知。但是我有更多视图,例如创建视图,更新视图,删除视图等。当用户首次登录我的应用程序时,我会显示通知和链接的数量,但是当用户切换到另一个视图时,通知数量将变为零。有什么办法可以在Django的每个视图中保留所有通知。这是我的views.py文件
pd.concat([df,diff],axis=1)
答案 0 :(得分:2)
高档网站为此使用websockets / AJAX。但是,如果您只希望它在每次页面加载时更新,请使用Django上下文处理器。
上下文处理器是一种功能,每次在渲染模板时都会运行。因此,首先编写该函数。如果当前用户已登录,则此函数返回一个包含object_list
,notification
和count
的字典,否则将不返回任何内容。 / 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 }}
等等等等。