You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

启用Django自定义context_processors致登录页报错:字典更新序列异常

问题原因及修复方案

错误根源

  1. 上下文处理器不能用@login_required装饰器:这个装饰器会在用户未认证时返回重定向的HttpResponse对象,但Django要求上下文处理器必须返回字典。模板引擎尝试把这个响应对象当作字典处理时,就会抛出dictionary update sequence element #0 has length 0; 2 is required错误。
  2. 函数存在无返回值分支:即便去掉装饰器,当前代码在用户未认证时没有返回语句,会默认返回None,同样不符合上下文处理器必须返回字典的要求。

修复步骤

1. 移除@login_required装饰器

上下文处理器本身可以通过request.user.is_authenticated判断用户认证状态,不需要依赖登录装饰器拦截请求。

2. 确保所有分支返回字典

在用户未认证时返回空字典,保证函数始终返回符合要求的字典类型。

修改后的context_processors.py代码

import datetime

from permission.models import UserPermission
from salemali.models import Salemali
from term.models import Term
from user.models import Branch


def date_context_processor(request):
    if request.user.is_authenticated:
        current_datetime = datetime.datetime.now()
        term = Term.objects.filter(status=1).order_by('-datestart')
        salemali = Salemali.objects.all()
        branch = Branch.objects.all()
        user_permissions = UserPermission.objects.filter(user=request.user).values_list('permission__name', flat=True)

        return {
            'current_day': current_datetime,
            'terms': term,
            'salemali': salemali,
            'branch': branch,
            'user_permissions': user_permissions
        }
    # 未认证用户返回空字典,保证函数始终返回字典
    return {}

原理说明

Django的上下文处理器会在每个请求渲染模板前执行,必须返回一个字典用于补充模板上下文。如果返回非字典类型(比如响应对象、None),模板引擎在尝试合并上下文时就会触发字典更新相关的错误。修改后,无论用户是否登录,处理器都返回字典,就能正常配合登录页面的渲染流程。

内容的提问来源于stack exchange,提问作者hamid333

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 06:42:41