几年后我回到django,我采用了基于类的视图 - 绝对是粉丝,但由于某种原因,我无法让我的自定义内容处理器显示其数据。我在我的应用程序中主要使用Generic Views,根据我的理解,他们应该自动为视图提供上下文。
这是我的上下文处理器(context_processors.py)
from models import Alert
def context_alerts(request):
alert_list = {}
alerts = Alert.objects.filter(to_user=request.user)
alert_list['alerts'] = alerts
alert_list['unread_count'] = len([a for a in alerts if a.unread == True])
# printing to console - this works
print alert_list
return alert_list
请注意,当我打印字典时 - 它显示在我的控制台中,所以我知道它正在触发。
在我的设置中设置如此
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [],
'APP_DIRS': True,
'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',
'part_iq.context_processors.context_alerts'
],
},
},
]
最后,这是一个示例视图 - 我有大约20个左右,所有基于标准类的视图:
class BuyerRfqList(ListView):
context_object_name = "rfqs"
template_name = "dashboard/buyer/rfq-list.html"
def get_queryset(self):
user = self.request.user
rfqs = Rfq.objects.filter(from_user=user, hidden=False).order_by("created_at")
return rfqs
我只是在模板中输出警报(同时尝试dict的名称和上下文处理器功能):
{{alert_list.unread_count}}
{{context_alerts.unread_count}}
没有运气。
我觉得这是显而易见的事情,但是我对Django来说太生气了,并且是ClassBasedViews的新手来解决这个问题
答案 0 :(得分:1)
两个问题:
您的" alert_list"中没有名为"count"
的密钥字典。该模板实际上被翻译为alert_list['count']
(因为#2),它不存在,所以它只是无声地失败。
访问Django模板中的字典就好像它们是对象一样。
所以alert_list['alerts']
相当于
{{ alert_list.alerts }}
现在您可以在Queryset上调用count
{{ alert_list.alerts.count }}
答案 1 :(得分:0)
您在模板中没有任何名为alerts_list
的内容。这只是您在函数内部使用的本地名称,用于保存变量的dict以传递给模板。该字典的内容将直接添加到上下文中:因此您可以访问{{ alerts }}
和{{ unread_count }}
。