Как добавить товар в корзину в ListView Django/

Я делаю приложение на django, добавление товаров в корзину в detail-view работает отлично, но я не могу реализовать то же самое в ListView. Что мне делать?

views.py

 class ShopListView(ListView):
        model = Item
        template_name =  'shop/home.html'
        context_object_name = 'items'
        def post(self, request, *args, **kwargs):
            pk = self.kwargs.get('pk')
            item = get_object_or_404(Item, id=pk)
            orderItem, created = OrderItem.objects.get_or_create(order_item=item)
            order, created = Order.objects.get_or_create(order_user=request.user)
            order.save()
            order.order_items.add(orderItem)
            return HttpResponse('Items added')

Также, если я делаю post(self,request,pk) как в DetailView, я получаю ошибку: отсутствует один аргумент 'pk'.

class ShopDetailView(DetailView):
    model = Item 
    template_name = 'shop/detail.html'
    context_object_name = 'item'

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['comments'] = Comment.objects.filter(item=self.object)
        context['form'] = CommentCreationForm()
        return context

    def post(self, request, pk):
        if 'buy' in request.POST:
            item = get_object_or_404(Item, id=pk)
            orderItem, created = OrderItem.objects.get_or_create(order_item=item)
            order, created = Order.objects.get_or_create(order_user=request.user)
            order.save()
            order.order_items.add(orderItem)
            return HttpResponse('Items added to the database')
        if 'comment' in request.POST:
            form = CommentCreationForm(request.POST)
            if form.is_valid():
                comment = form.save(commit=False)
                comment.comment_user = request.user
                comment.item = Item.objects.get(id=pk)
                comment.save()
                return HttpResponse('post-created')
            else:
                return HttpResponse('post not created')

DetailView работает нормально.

Ваш подкласс DetailView работает, потому что он получает объект pk из url kwargs. Но в случае подкласса ListView, вам нужно передать pk как параметр Post в запросе, а затем получить его:

class ShopListView(ListView):
    model = Item
    template_name = 'shop/home.html'
    context_object_name = 'items'

    def post(self, request, *args, **kwargs):
        pk = request.POST.get('pk')
        item = get_object_or_404(Item, id=pk)
        orderItem, _ = OrderItem.objects.get_or_create(order_item=item)
        order, _ = Order.objects.get_or_create(order_user=request.user)
        order.order_items.add(orderItem)
        return HttpResponse('Items added')
Вернуться на верх