我已经导入了
django_restframework.decorators from api_view
@api_view(['POST'])
def post_cart(self,request):
serializer = CartItemSerializer(data=request.data)
if serializer.is_valid():
serializer.save()
return Response({"status": "success", "data": serializer.data}, status=status.HTTP_200_OK)
else:
return Response({"status": "error", "data": serializer.errors}, status=status.HTTP_400_BAD_REQUEST)
curl -X POST -H "Content-Type: application/json" http://127.0.0.1:8000/api/cart-items/ -d "{\"product_name\":\"name\",\"product_price\":\"41\",\"product_quantity\":\"1\"}"
当我使用
@api_view(['GET'])
时,我收到此错误
{
"detail": "Method \"POST\" not allowed."
}
但是当我像这样改变时它就起作用了
def post(self,request):
serializer = CartItemSerializer(data=request.data)
if serializer.is_valid():
serializer.save()
return Response({"status": "success", "data": serializer.data}, status=status.HTTP_200_OK)
else:
return Response({"status": "error", "data": serializer.errors}, status=status.HTTP_400_BAD_REQUEST)
curl -X POST -H "Content-Type: application/json" http://127.0.0.1:8000/api/cart-items/ -d "{\"product_name\":\"name\",\"product_price\":\"41\",\"product_quantity\":\"1\"}"
返回成功200
{
"status": "success",
"data": {
"id": 5,
"product_name": "item",
"product_price": 12.5,
"product_quantity": 5
}
}
购物车项目查看代码
from django.shortcuts import render
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status
from .serializers import CartItemSerializer
from .models import CartItem
from django.shortcuts import get_object_or_404
from rest_framework.decorators import api_view
class CartItemViews(APIView):
@api_view(['POST'])
def post_cart(self,request):
serializer = CartItemSerializer(data=request.data)
if serializer.is_valid():
serializer.save()
return Response({"status": "success", "data": serializer.data}, status=status.HTTP_200_OK)
else:
return Response({"status": "error", "data": serializer.errors}, status=status.HTTP_400_BAD_REQUEST)
def get(self,request, id=None):
if id:
item = CartItem.objects.get(id=id)
serializer = CartItemSerializer(item)
return Response({"status": "success", "data": serializer.data}, status=status.HTTP_200_OK)
items = CartItem.objects.all()
serializer = CartItemSerializer(items, many=True)
return Response({"status": "success", "data": serializer.data}, status=status.HTTP_200_OK)
def patch(self,request, id=None):
if id:
item = CartItem.objects.get(id=id)
serializer = CartItemSerializer(item,data=request.data,partial=True)
if serializer.is_valid():
serializer.save()
return Response({"status": "success", "data": serializer.data})
else:
return Response({"status": "error", "data": serializer.errors})
def delete(self, request, id=None):
item = get_object_or_404(CartItem, id=id)
item.delete()
return Response({"status": "success", "data": "Item Deleted"})
url.py
from django.urls import path
from .views import CartItemViews
urlpatterns = [
path('cart-items/',CartItemViews.as_view()),
path('cart-items/<int:id>', CartItemViews.as_view()),
]
您不要在基于类的视图的成员上使用
@api_view(['POST'])
:@ap_view(…)
装饰器[drf-doc]将函数转换为基于类的视图,所以现在您的post_cart
是类中的类。
可以使用以下方法将 POST 请求路由到未命名的方法
post
@action(…)
[drf-doc]:
from rest_framework.decorators import action
class CartItemViews(APIView):
@action(methods=['post'], detail=False)
def post_cart(self, request):
# …
pass
话虽如此,我不明白为什么使用
def post
在这里不起作用。
仍然出现错误[14/Mar/2024 21:03:37]“POST /api/cart-items/ HTTP/1.1”405 41
您应该向
/api/cart/post_cart/
发出发布请求或在 url_path='cart-items' and url_name='cart-items'
装饰器上设置 @action
。 链接
默认情况下,URL 模式基于方法名称,URL 名称是 ViewSet.basename 和连字符方法名称的组合。