对象没有'object_list'属性。

3

我遇到了一个错误,我认为可能是和Viktor遇到的问题相同('ProductList'对象没有'object_list'属性)

AKS在Viktors的帖子中写道 -

您可能会在超类的get_context_data()方法中的以下行上遇到错误:

queryset = kwargs.pop('object_list', self.object_list)
< p > BaseListView 的 get 方法通过调用 get_queryset 方法将 object_list 设置为视图上的值:

self.object_list = self.get_queryset()

然而,在你的情况下,你在get_queryset方法中调用了get_context_data(),此时视图上的object_list尚未设置。

我回顾了我的跟踪记录并看到了AKS提到的代码。

  File "C:\Users\HP\Django Projects\EcommerceProject\products\views.py", line 48, in get_context_data
    context = super(ProductListView, self).get_context_data(*args, **kwargs)
  File "c:\Users\HP\DJANGO~1\ECOMME~1\lib\site-packages\django\views\generic\list.py", line 131, in get_context_data
    queryset = kwargs.pop('object_list', self.object_list)
AttributeError: 'ProductListView' object has no attribute 'object_list'
[03/Aug/2020 18:20:21] "GET /products/ HTTP/1.1" 500 90906

这是我的代码

class ProductListView(ListView):
    model = Product
    template_name = "products/list.html"
    # added for pagination
    context_object_name='object_list' #Default: object_list
    # print(context_object_name)
    # paginate_by = 3

def get_context_data(self, *args, **kwargs):
    context = super(ProductListView, self).get_context_data(*args, **kwargs)
    cart_obj, new_obj = Cart.objects.new_or_get(self.request)
    print("get context data")
    # context = {}
    context['cart'] = cart_obj
    return context



def get_queryset(self, *args, **kwargs):
    request = self.request
    return Product.objects.all()

def get(self, request):
    
    paginate_by = request.GET.get('paginate_by',6) or 4
    data = self.model.objects.all()
    paginator = Paginator(data, paginate_by)
    page = request.GET.get('page')
   
    try:
        paginated = paginator.page(page)
    except PageNotAnInteger:
        paginated = paginator.page(1)
    except EmptyPage:
        paginated = paginator.page(paginator.num_pages)

    # context={}
    context = self.get_context_data()
    context['DataPaginated'] = paginated
    context['paginate_by'] = paginate_by

    # return render(request, self.template_name, {'DataPaginated':paginated, 'paginate_by':paginate_by, 'cart':cart_obj})
    return render(request, self.template_name, context)

问题已解决

我稍微修改了ProductListView(ListView):类中的get_context_data函数:

def get_context_data(self, *args, **kwargs):
    self.object_list = super().get_queryset()
    context = super(ProductListView, self).get_context_data(*args, **kwargs)
    

self.object_list 不存在,那只是传递给上下文的项目的名称而已。 - Willem Van Onsem
我该如何纠正这个问题?我有点明白你在说什么,但我真的不确定如何修复这个问题。 - Ross Symonds
1个回答

0
你想解决的确切问题是什么,或者你想通过代码解决什么问题?
你想设置一个上下文对象名称,还是想从Product模型中检索数据?
如果要从Product模型中检索数据,你可以直接使用objects.filter。
如果这行代码:context = super(ProductListView, self).get_context_data(*args, **kwargs) 是你想解决的问题...尝试将def get_context_data移动到ProductListView类内部。

当我向用户展示要购买的产品时,我希望根据该商品是否已经在购物车中,显示一个“立即购买”或“从购物车移除”按钮。 - Ross Symonds
cart_obj, new_obj = Cart.objects.new_or_get(self.request) 检查是否存在特定用户的购物车。如果不存在,则创建一个新的购物车。 - Ross Symonds

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接