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

Django报错:'dict'对象无'availability'属性,如何检查购物车商品库存?

购物车库存检查报错:'dict' object has no attribute 'availability'

在Django购物车视图中,需要检查购物车中是否存在至少一个product.availability=False的商品并在模板展示,但访问属性时触发AttributeError: 'dict' object has no attribute 'availability',相关代码及错误回溯如下:

模型代码

class Product(models.Model):
    availability = models.BooleanField()

工具函数代码

def cookieCart(request):
    try:
        cart = json.loads(request.COOKIES['cart'])
    except:
        cart = {}
    items = []
    for i in cart:
        try:
            product = Product.objects.get(id=i)
            total = product.final_price * cart[i]["quantity"]
            item = {
                'product':{
                    'id':product.id,
                    'name':product.name,
                    'final_price':product.final_price,
                    'image_URL':product.image_URL,
                    'availability':product.availability,
                },
                'quantity':cart[i]["quantity"],
                'get_total':total,
            }
            items.append(item)
        except:
            pass

    return {"items": items}

def cartData(request):
    if request.user.is_authenticated:
        customer = request.user.customer
        order, created = Order.objects.get_or_create(customer=customer, complete=False)
        items = order.orderitem_set.all()
    else:
        cookieData = cookieCart(request)
        items = cookieData['items']
    return {'items':items}

视图代码

def cart(request):
    data = cartData(request)
    items = data['items']

    # 尝试检查购物车中是否所有商品都有库存,触发报错
    available = all(x.availability for x in items)

    context = {'items': items, 'available': available}
    return render(request, 'shop/cart.html', context)

模板代码

<p>{{items.product.name}}</p>
{% if available %}
    <a href="#">Checkout</a>
{% else %}
    <p>Out of stock</p>
{% endif %}

错误回溯

Traceback (most recent call last):
  File "D:\test\lib\site-packages\django\core\handlers\exception.py", line 47, in inner
    response = get_response(request)
  File "D:\test\lib\site-packages\django\core\handlers\base.py", line 181, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "D:\test\shop\views.py", line 101, in cart
    available = all(x.availability for x in items)
  File "D:\test\shop\views.py", line 101, in <genexpr>
    available = all(x.availability for x in items)

Exception Type: AttributeError at /shop/cart
Exception Value: 'dict' object has no attribute 'availability'

问题原因

  • 未登录用户的items是cookieCart生成的字典列表,availability嵌套在item['product']字典中,不是直接的属性;
  • 登录用户的items是OrderItem模型实例集合,需要通过item.product.availability访问库存状态,而非item.availability。

修复方案

统一两种场景的访问逻辑,修改视图中的检查代码:

def cart(request):
    data = cartData(request)
    items = data['items']

    # 统一处理登录/未登录场景的库存判断
    def check_availability(item):
        # 模型实例(登录用户)
        if hasattr(item, 'product'):
            return item.product.availability
        # 字典(未登录用户)
        else:
            return item['product']['availability']
    
    # 检查所有商品是否都有库存,只要一个缺货就返回False
    available = all(check_availability(x) for x in items)

    context = {'items': items, 'available': available}
    return render(request, 'shop/cart.html', context)

同时修正模板中的遍历错误,原代码未循环items列表:

{% for item in items %}
<p>{{ item.product.name }}</p>
{% endfor %}
{% if available %}
    <a href="#">Checkout</a>
{% else %}
    <p>部分商品缺货,无法结算</p>
{% endif %}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 18:10:36