我想编写一个上下文处理器,以便可以在Django(版本2.1)的应用程序中的任何位置看到该列表。 我遇到错误:
ValueError at /
dictionary update sequence element #0 has length 1; 2 is required
def following_issues(request):
request_context = RequestContext(request)
request_context.push({'following_issues': Issue.objects.filter(followers=request.user.is_authenticated)})
return request_context
在我的设置中:
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR, 'templates')],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.request',
'django.template.context_processors.debug',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
'base.context_processors.following_issues',
],
},
},
]
答案 0 :(得分:2)
我认为您误解了如何编写上下文处理器。正如documentation [Django-doc]所说:
上下文处理器的界面非常简单:这是一个 Python函数,它带有一个参数,一个
HttpRequest
对象,并且返回一个字典模板上下文。每个上下文处理器必须返回一个字典。
所以您应该简单地这样写:
def following_issues(request):
if request.user.is_authenticated:
return {
'following_topics': Issue.objects.filter(followers=request.user)
}
else:
return {
'following_topics': Issue.objects.none()
}
因此,我们可以在此处简单地返回一个字典,将following_topics
映射到Issue.objects.filter(..)
表达式上。
此外,您不能指定followers=request.user.is_authenticated
,因为这是一个布尔值,并且鉴于我正确理解了建模,您可能会根据用户进行过滤。在这里,我写道,如果用户未通过身份验证,我们将返回一个空的QuerySet
。