代码之家  ›  专栏  ›  技术社区  ›  Gitesh kumar Jha

无法在django rest API中使用POST请求存储数据

  •  -1
  • Gitesh kumar Jha  · 技术社区  · 7 年前

    免责声明:-我是初学者。 我正在尝试构建一个Django REST API,它可以支持所有CRUD操作。 我能够从API调用(127.0.0.1/API/get)中获取数据,也能够从UI中手动添加、修改和删除记录(在get请求之后)。 我在模板目录中创建了一个表单,它接收用户的输入,并在提交时发送到同一个url(127.0.0.1/api/get),但数据没有保存,而是返回以下内容:- HTTP 400错误请求 允许:获取、发布、头部、选项 内容类型:application/json 改变:接受

    { “sourceName”:[ “此字段为必填字段。” ], “源URL”:[ “此字段为必填字段。” ] }

    我只有一个应用(来源)。 意见。py:-

    from django.http import HttpResponse, JsonResponse
    from django.views.decorators.csrf import csrf_exempt
    from source import models
    from source import serializers
    from django.shortcuts import render
    from rest_framework import viewsets
    from rest_framework.views import APIView
    
    def home(request):
        return render(request, 'Forms/input.html')
    
    class SourceViewset(viewsets.ModelViewSet):
        print("Inside ConnectionInfoViewset..")
        queryset = models.Source.objects.all()
        serializer_class = serializers.SourceSerializer
        print("Inside ConnectionInfoViewset..")
    
        def post(self,request):
            print("Inside POST")
            return JsonResponse("From POST", safe=False)
            serializer = serializers.SourceSerializer(data=request.data)
            if serializer.is_valid():
                serializer.save()
                return Response(serializer.data, status=status.HTTP_201_CREATED)
            return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
    
    
    source_urls.py
    from django.urls import path, include
    from source import views
    from rest_framework import routers
    from . import views
    router = routers.DefaultRouter()
    router.register('', views.SourceViewset)
    
    urlpatterns = [
        path('', views.home),
        path('get/', include(router.urls)),
    ]
    
    serializers.py:-
    
    from rest_framework import serializers
    from source import models
    from django.http import HttpResponse, JsonResponse
    from django.views.decorators.csrf import csrf_exempt
    
    class SourceSerializer(serializers.ModelSerializer):
        class Meta:
            model = models.Source
            # fields = '__all__'
            fields = ('sourceName','sourceURL')
    
    models.py:- 
    
    from django.db import models
    
    # Create your models here.
    
    class Source(models.Model):
        sourceName =  models.CharField(max_length = 40)
        sourceURL = models.CharField(max_length = 40)    
    
    def __str__(self):
        return self.__all__
    
    input.html:- 
    
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <meta http-equiv="X-UA-Compatible" content="ie=edge">
        <title>Document</title>
    </head>
    <body>
        <form action="/api/get/"  method = "POST">
            {% csrf_token %}
            <input type="text" placeholder="SourceName" name = 'user_name'> <br>
            <input type="text" placeholder="SourceURL" name = 'password'><br>
            <button type="submit">Submit</button>
        </form>
    </body>
    </html>
    
    2 回复  |  直到 7 年前
        1
  •  0
  •   Sakthi Panneerselvam    7 年前

    这就是viewset在DRF包中的定义方式,您可以在相应的块中编写自定义的方法代码。

    class UserViewSet(viewsets.ViewSet):
    """
    Example empty viewset demonstrating the standard
    actions that will be handled by a router class.
    
    If you're using format suffixes, make sure to also include
    the `format=None` keyword argument for each action.
    """
    
    def list(self, request):
        pass
    
    def create(self, request):
        pass
    
    def retrieve(self, request, pk=None):
        pass
    
    def update(self, request, pk=None):
        pass
    
    def partial_update(self, request, pk=None):
        pass
    
    def destroy(self, request, pk=None):
        pass
    

    还有一件事你不能用同样的表单来做,那就是你需要在ajax中捕获submit并调用API。这就是它的工作原理。

        2
  •  0
  •   Gitesh kumar Jha    7 年前
    class SourceViewset(viewsets.ModelViewSet):
        def list(self, request):
            print("inside list")
            queryset = models.Source.objects.all()
            serializer_class = serializers.SourceSerializer
    
        def create(self, request):
            serializer = serializers.SourceSerializer(data=request.data)
            if serializer.is_valid():
                serializer.save()
                return Response(serializer.data, status=status.HTTP_201_CREATED)
            return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
    

    你的意思是实现定制的GET和POST请求处理程序,它应该是这样的吗?例如上面的例子,因为它不是这样工作的。很明显,我遗漏了一些东西,你能纠正这个GET和POST的例子吗?

    推荐文章