Блок-схема метода представления списка - PullRequest
0 голосов
/ 05 августа 2020

С моими продуктами я хотел купить или удалить из корзины кнопку в зависимости от того, был ли товар уже в корзине. Я получил обратную связь. У меня была эта проблема

queryset = kwargs.pop('object_list', self.object_list)
AttributeError: 'ProductListView' object has no attribute 'object_list'

Это мой исходный код

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 = self.get_context_data()
    context['DataPaginated'] = paginated
    context['paginate_by'] = paginate_by

    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)
    

Я изучил код для ListView здесь https://www.kite.com/python/docs/django.views.generic.ListView.

Блок-схема метода

dispatch()
http_method_not_allowed()
get_template_names()
get_queryset()
get_context_object_name()
get_context_data()
get()
render_to_response()

Я сбит с толку, зачем добавлять super().get_queryset() хотя помогло. Моя первоначальная проблема заключалась в том, что у объекта не было атрибута object_list. Метод get BaseListView устанавливает object_list в представлении, вызывая метод get_queryset. Согласно блок-схеме метода вы запускаете get_queryset() 4-й и get_context_data() 6-й. Поэтому я предположил, что к тому времени, как я запустил get_context_data(), object_list уже было бы присвоено значение.

...