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_
相关产品推荐
相关产品推荐

