为什么Django的cart模板标签报错object has no attribute 'is_authenticated'
报错产生原因
- Django版本兼容问题:Django 1.10及更早版本中,
is_authenticated是需要调用的方法而非直接访问的属性,直接写user.is_authenticated访问就会触发属性不存在的报错。 - 传入过滤器的参数不合法:模板渲染时传入的不是合法的User/AnonymousUser实例,比如上下文的
user变量被覆盖为其他类型对象、调用过滤器时误传了其他参数,都会导致目标对象没有is_authenticated属性。
修复方案
- 兼容不同版本的
is_authenticated调用逻辑,同时增加参数合法性校验,修改后代码如下:
register = template.Library() @register.filter def cart_item_count(user): # 先校验传入对象是否有对应属性/方法 if not hasattr(user, 'is_authenticated'): return 0 # 兼容方法、属性两种实现 is_auth = user.is_authenticated if callable(is_auth): is_auth = is_auth() if is_auth: qs = Order.objects.filter(user=user, ordered=False) if qs.exists(): # 若你的Order模型关联订单项的字段为复数形式items,请改为 .items.count() return qs[0].item.count() return 0
- 检查模板调用格式,确保传入的是正确的用户对象,示例调用方式:
{{ request.user|cart_item_count }}
- 确认项目配置的
TEMPLATES选项中,上下文处理器包含django.contrib.auth.context_processors.auth,保证模板可以正常获取到全局用户变量。
提示:如果你的Django版本 >= 3.0,
is_authenticated已经固定为布尔属性,不需要调用,这种情况优先排查传入过滤器的参数是否为合法的用户实例。
内容的提问来源于stack exchange,提问作者ALLAN AYIKANYING
相关产品推荐
相关产品推荐

