объект не имеет атрибута 'object_list' - PullRequest
0 голосов
/ 03 августа 2020

Я получаю сообщение об ошибке, и я думаю, что это может быть по тем же причинам, что и у Виктора ( объект 'ProductList' не имеет атрибута 'object_list' )

В сообщении Виктора AKS написал -

Вы могли получить ошибку в следующей строке в get_context_data () суперкласса:

queryset = kwargs.pop('object_list', self.object_list)

Метод get BaseListView устанавливает object_list в представлении вызывая метод get_queryset:

self.object_list = self.get_queryset()

Но в вашем случае вы вызываете get_context_data() в самом методе get_queryset, и в это время 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)

Проблема исправлена ​​

Немного изменил функцию get_context_data в классе ProductListView(ListView):

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

1 Ответ

0 голосов
/ 04 августа 2020

Какую именно проблему вы пытаетесь решить или что именно вы пытаетесь решить с помощью кода?

Вы хотите установить имя объекта контекста или хотите получить данные из Продукта model?

При получении данных из модели продукта вы можете просто использовать objects.filter.

Если эта строка: context = super(ProductListView, self).get_context_data(*args, **kwargs) - проблема, которую вы пытаетесь решить .. попробуйте переместить def get_context_data относится к классу ProductListView.

...