Метод POST не разрешен в пользовательских представлениях - PullRequest
0 голосов
/ 18 октября 2019

если я собираюсь добавить товары в корзину, я получаю сообщение об ошибке. Метод POST не разрешен

views.py

class CartViewSet(viewsets.ModelViewSet):
    queryset = Cart.objects.all()
    serializer_class = CartSerializer


@action(methods=['post', 'put'], detail=False)
def add_to_cart(self, request, pk=None):

    cart = self.get_object()
    try:
        cart.user = self.request.user
        product = Product.objects.get(pk=request.data['product'])
        quantity = int(request.data['quantity'])
    except Exception as e:
        print(e)
        return Response({'status': 'fail'})

    if product.inventory <= 0 or product.inventory - quantity < 0:
        print('There is no inventory in store')

        return Response({'status': 'fail'})

    existing_cart_item = CartItem.objects.filter(cart=cart, product=product).first()

    if existing_cart_item:
        existing_cart_item.quantity += quantity
        existing_cart_item.save()

    else:
        new_cart_item = CartItem(cart=cart, product=product, quantity=quantity)
        new_cart_item.save()

    serializer = CartSerializer(cart)
    return Response(serializer.data, status=status.HTTP_201_CREATED)

urls.py

router = routers.DefaultRouter()
router.register(r'carts', CartViewSet)
router.register(r'cart_items', CartItemViewSet)



urlpatterns = [
    path('', include(router.urls)),
]

Работает, когда яукажите URL-адрес вот так carts/1/add_to_cart здесь я даю идентификатор своей корзины, но в моем случае это неправильно, потому что когда создается пользователь, корзина также создается, поэтому идентификаторы пользователя и корзины совпадают. Мне не нужно указывать идентификатор корзины в URL, потому что я помещаю токен в раздел «Авторизация» в «Почтальоне», так как он должен определять, какой пользователь отправляет запрос на публикацию. Выше показано, что я добавил cart.user=self.request.user, но он все еще не работает. Как я могу решить эту проблему? Любая помощь будет оценена)

1 Ответ

0 голосов
/ 18 октября 2019

Так что ваша проблема не в том, что "метод публикации не разрешен"

Вы хотите сделать что-то вроде этого:

[POST,PUT] carts/add_to_cart 

, и это должно добавить элементы в корзину пользователя.

Я думаю, что ModelViewSet не очень хороший выбор представления для этой операции (так, как вы хотите это сделать).

Я бы создал новое представление для обработки этого, и оставил бы представление для обработкиОперации с корзиной.

Итак, удалите метод add_to_cart из своего представления.

Вы можете создать представление следующим образом:

class CartUpdateView(generics.UpdateAPIView):

    queryset = None
    serializer_class = CartUpdateSerializer

    def get_object(self):
        return self.request.user.cart

Зарегистрируйте это представление для своей конечной точки (даже если ябудет по-разному структурировать конечные точки):

path("cart/add_to_cart", CartUpdateView.as_view())

и создаст CartUpdateSerializer для добавления товаров в корзину (как вы делали в add_to_cart, но вместо этого он будет в сериализаторе).

И не полагайтесь на то, что Корзина и Пользователь имеют одинаковые идентификаторы, даже если вы их создаете в одно и то же время. Это не гарантировано.

...