【问题标题】:Django Error: 'dict' object has no attribute 'availability'Django 错误:\'dict\' 对象没有属性 \'availability\'
【发布时间】:2022-10-24 05:47:29
【问题描述】:

我有一个购物车视图,我正在尝试检查添加到购物车的产品是否在列表中甚至有一项将 product.availability 设置为 False 并在模板中相应地工作,问题在于访问购物车中的产品可用性对象列表,那么我如何检查人们添加到购物车的产品的可用性?

PS我缩短了utils的代码,如果需要理解我会添加更多

模型

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)
            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)
    #products added to cart
    items = data['items']

    #Checking if even one product added to cart has availability set to False
    available = all(x.availability for x in items)

    context = {'items': items, 'available': available}

模板

<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'

【问题讨论】:

    标签: python django


    【解决方案1】:

    它非常简单,在 cookieCart 函数中,您将附加到项目列表的字典,而不是 Product 对象。

    改成:

    def cookieCart(request):
        try:
            cart = json.loads(request.COOKIES['cart'])
        except:
            cart = {}
        items = []
        for i in cart:
            try:
                product = Product.objects.get(id=i)            
                items.append(product)
            except:
                pass
    
        return {"items": items}
    

    【讨论】:

      【解决方案2】:

      在按 ID 过滤产品后,您应该简单地返回 QuerySetProduct 对象,而不是创建具有必要的 availability 属性的临时字典:

      def cookieCart(request):
          try:
              cart = json.loads(request.COOKIES['cart'])
          except:
              cart = {}
          return {"items": Product.objects.filter(id__in=cart)}
      

      【讨论】:

      • 是的,它有效,但与“项目”上下文变量相关的所有其他数据都消失了,我该如何解决?谢谢!
      【解决方案3】:

      这部分正在创建问题

      def cookieCart(request):
          try:
              cart = json.loads(request.COOKIES['cart'])
          except:
              cart = {}
          items = []
          for i in cart:
              try:
                  product = Product.objects.get(id=i)
                  item = {
                      'product':{
                          'id':product.id,
                          'name':product.name,
                          'final_price':product.final_price,
                          'image_URL':product.image_URL,
                          'availability':product.availability,
                      },
                      }
                  items.append(item)
              except:
                  pass
      
          return {"items": items} # here your items is like this {"items": [{'product':{'id':product.id,'name':product.name,'final_price':product.final_price,'image_URL':product.image_URL,'availability':product.availability}}]}
      

      由于错误提示您从 COOKIES 中选择了项目

      现在因为你循环为all(x.availability for x in items) x 看起来像 {price: {...}} 这是 dict 对象,这就是说 dict 对象没有属性可用性

      要解决此问题,请像这样使用SimpleNameSpace

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

      对于优化方式 你可以检查@blhsing解决方案

      【讨论】:

      • 我也试过你的方法,即使有产品,整个购物车都是空的,没有状态错误,我在 utils 中添加了两行额外的代码,请看一下,谢谢!
      【解决方案4】:

      该错误告诉您的是您正在尝试将 dict 项目作为属性访问。

      这应该是:

      available = all(x['availability'] for x in items)
      

      【讨论】:

        猜你喜欢
        • 2015-08-05
        • 2014-10-27
        • 2018-02-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-07-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多