值错误字典更新序列元素#0的长度为1; 2个为必填项

时间:2019-05-22 22:03:06

标签: python django backend

我想编写一个上下文处理器,以便可以在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',
            ],
        },
    },
]

1 个答案:

答案 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