使用功能视图添加到购物车功能在 django rest 框架中不起作用
add to cart function not working in django rest framework using functional view
我尝试使用(非 api-服务器端)代码到 Django rest 框架 中创建一个添加到购物车 api。但是当我在 postman 中调用 api 时,它显示 403 forbidden。我没有在此视图中使用任何序列化程序。
此外,我尝试使用 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,
)
我的url:
路径('api/addorderitem/int:pk',views.add_to_cart,名称='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 函数不接受 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__'
您收到 403 禁止请求,可能是因为请求用户未经身份验证。由于您使用的是 @login_required
装饰器,因此只有经过身份验证的用户才能访问 add_to_cart 视图。
要在 ListCreateAPIView 中访问 pk,尝试
pk = self.kwargs.get('pk')
最后,我可以使用 APIView 将商品添加到购物车。 APIView 是一个基础class,我们可以根据需要和业务逻辑覆盖任何自定义函数(post、get 等)。
这是我的观点,有效。
class AddtoOrderItemView(APIView):
permission_classes = [IsAuthenticated]
# queryset = OrderItem.objects.all()
# serializer_class = OrderItemSerializer
# @action(detail=True, methods=['post'])
# @login_required
def post(self, request, 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": "Quantity is added",
},
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.now()
order = Order.objects.create(user=self.request.user, ordered_date=ordered_date)
order.items.add(order_item)
return Response({"message": "Order is created & Item added to your cart", },
status=status.HTTP_200_OK,
)
在这里,我根据需要使用 (self,request,pk) 作为参数来覆盖 post 函数。这不是覆盖 post 函数的标准方法,但我们可以在 APIView 中以这种方式编写。
我尝试使用(非 api-服务器端)代码到 Django rest 框架 中创建一个添加到购物车 api。但是当我在 postman 中调用 api 时,它显示 403 forbidden。我没有在此视图中使用任何序列化程序。
此外,我尝试使用 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,
)
我的url:
路径('api/addorderitem/int:pk',views.add_to_cart,名称='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 函数不接受 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__'
您收到 403 禁止请求,可能是因为请求用户未经身份验证。由于您使用的是 @login_required
装饰器,因此只有经过身份验证的用户才能访问 add_to_cart 视图。
要在 ListCreateAPIView 中访问 pk,尝试
pk = self.kwargs.get('pk')
最后,我可以使用 APIView 将商品添加到购物车。 APIView 是一个基础class,我们可以根据需要和业务逻辑覆盖任何自定义函数(post、get 等)。
这是我的观点,有效。
class AddtoOrderItemView(APIView):
permission_classes = [IsAuthenticated]
# queryset = OrderItem.objects.all()
# serializer_class = OrderItemSerializer
# @action(detail=True, methods=['post'])
# @login_required
def post(self, request, 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": "Quantity is added",
},
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.now()
order = Order.objects.create(user=self.request.user, ordered_date=ordered_date)
order.items.add(order_item)
return Response({"message": "Order is created & Item added to your cart", },
status=status.HTTP_200_OK,
)
在这里,我根据需要使用 (self,request,pk) 作为参数来覆盖 post 函数。这不是覆盖 post 函数的标准方法,但我们可以在 APIView 中以这种方式编写。