首页 > 解决方案 > 使用功能视图添加到购物车功能在 django rest 框架中不起作用

问题描述

我尝试使用(非 api-server-side)代码在Django rest framework中创建一个 add-to-cart api 。但是当我在邮递员中调用 api 时,它显示 403 被禁止。在这个视图中我没有使用任何序列化程序。

另外,我尝试使用 APIView 和序列化程序,但效果不佳。我是 Django 休息框架的新手。我需要帮助来写这个。

我的模型:

class OrderItem(models.Model) :
    user = models.ForeignKey(User,on_delete=models.CASCADE,null=True, blank=True)
    ordered = models.BooleanField(default=False)
    item = models.ForeignKey(Product, on_delete=models.CASCADE,blank=True, null=True)
    quantity = models.IntegerField(default=1)


    def __str__(self):
        return f"{self.quantity} of {self.item.name}"

class Order(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE,null=True, blank=True)
    items = models.ManyToManyField(OrderItem,blank=True, null=True)
    start_date = models.DateTimeField(auto_now_add=True)
    ordered_date = models.DateTimeField()
    ordered = models.BooleanField(default=False)

    def __str__(self):
        return self.user.email

我的看法:

@login_required
def add_to_cart(self, pk):
    item = get_object_or_404(Product, pk=pk)
    order_item, created = OrderItem.objects.get_or_create(
        item=item,
        user=self.request.user,
        ordered=False
    )
    order_qs = Order.objects.filter(user=self.request.user, ordered=False)

    if order_qs.exists():
        order = order_qs[0]

        if order.items.filter(item__pk=item.pk).exists():
            order_item.quantity += 1
            order_item.save()
            return Response({"message": "Added quantity Item", },
                            status=status.HTTP_200_OK
                            )
        else:
            order.items.add(order_item)
            return Response({"message": " Item added to your cart", },
                            status=status.HTTP_200_OK,
                            )
    else:
        ordered_date = datetime.timezone.now()
        order = Order.objects.create(user=self.request.user, ordered_date=ordered_date)
        order.items.add(order_item)
        return Response({"message": "Item added to your cart", },
                        status=status.HTTP_200_OK,
                        )

我的网址:

路径('api/addorderitem/int:pk',views.add_to_cart,name='api-addorder'),

以下代码使用 APIView:

class AddtoOrderItemView(ListCreateAPIView):
     permission_classes = [IsAuthenticated]
     queryset = OrderItem.objects.all()
     serializer_class = OrderItemSerializer
     def post(self,request,*args,**kwargs)
      """same code as abvoe""

这里 post fucntion 不需要 pk,但我的代码中有 pk 无法识别。所以,我不知道该怎么做,因为我们不能在ListCreateAPIView中使用 def add_to_cart(self, pk) 。

我的序列化器:

class OrderItemSerializer(serializers.ModelSerializer):
    class Meta:
        model = OrderItem
        fields = ['id','user','ordered','item', 'quantity']
        depth = 1

class OrderSerializer(serializers.ModelSerializer):
    class Meta:
        model = Order
        fields = '__all__'

标签: djangoapidjango-rest-frameworkcartdjango-generic-views

解决方案


您收到 403 禁止可能是因为请求用户未经身份验证。由于您使用的是@login_required装饰器,因此只有经过身份验证的用户才能访问 add_to_cart 视图。

要访问 ListCreateAPIView 中的 pk,请尝试

pk = self.kwargs.get('pk')

推荐阅读