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

Django登出触发AttributeError:AnonymousUser无UserShoppingCartRelatedName属性

问题解决:登出时购物车上下文处理器触发AttributeError

问题原因

用户登出后,request.user会变为Django的AnonymousUser对象,该对象没有与ShopingCart模型关联的UserShoppingCartRelatedName属性,直接调用request.user.UserShoppingCartRelatedName.all()就会抛出属性不存在的错误。

解决方案

修改上下文处理器,先判断用户是否已登录,仅在登录状态下获取购物车数据,未登录时返回空查询集(或空列表),确保模板遍历逻辑不会出错:

def ShoppingCart(request):
    if request.user.is_authenticated:
        return {"ShoppingCart": request.user.UserShoppingCartRelatedName.all()}
    # 未登录时返回空查询集,和正常查询集接口一致
    return {"ShoppingCart": ShopingCart.objects.none()}

如果更倾向返回空列表,也可以这样写:

def ShoppingCart(request):
    cart_items = request.user.UserShoppingCartRelatedName.all() if request.user.is_authenticated else []
    return {"ShoppingCart": cart_items}

额外优化建议

  • 遵循PEP8命名规范:模型字段名改用小写(如User改为user、Product改为product),上下文处理器函数名用小写加下划线(如shopping_cart替代ShoppingCart)
  • 简化关联名称,提升可读性,修改后的模型代码示例:
class ShoppingCart(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL, related_name='shopping_carts', on_delete=models.CASCADE)
    product = models.ForeignKey(Products, related_name='shopping_cart_items', on_delete=models.CASCADE)

对应的上下文处理器同步调整:

def shopping_cart(request):
    if request.user.is_authenticated:
        return {"shopping_cart": request.user.shopping_carts.all()}
    return {"shopping_cart": ShoppingCart.objects.none()}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 20:54:30