Python 从Django窗体调用Django Rest API

Python 从Django窗体调用Django Rest API,python,html,django,django-rest-framework,Python,Html,Django,Django Rest Framework,我使用APIView构建了一个Django Rest API,该API将文件上传到web服务器的文件夹中 此API正在与Postman协作,如下图所示: 现在,我正在从以下HTML表单调用此API: 我面临的问题:通过表单发送的文件返回以下错误: "file": [ "No file was submitted." ] 可能与文件绑定有关,因为文件以表单形式上载,但未发送到API 下面是我的申请代码: index.html <form action="/file/uploa

我使用APIView构建了一个Django Rest API,该API将文件上传到web服务器的文件夹中

此API正在与Postman协作,如下图所示:

现在,我正在从以下HTML表单调用此API:

我面临的问题:通过表单发送的文件返回以下错误:

"file": [
    "No file was submitted."
]
可能与文件绑定有关,因为文件以表单形式上载,但未发送到API

下面是我的申请代码:

index.html

<form action="/file/upload/" method="post" enctype="multipart/form-data">
  {% csrf_token %}
  {{ form.as_p }}
  <input id="audio_file" type="file"/>
  <input type="submit" value="Upload File" name="submit"/>
</form>
型号.py

class IndexView(TemplateView):
    template_name = "index.html"
    log = logging.getLogger(__name__)
    log.debug("Debug testing")

    def post(self, request): # TODO: fix, empty file error returned after calling post method
        # if this is a POST request we need to process the form data
        if request.method == 'POST':
            # create a form instance and populate it with data from the request:
            # https://docs.djangoproject.com/en/2.2/ref/forms/api/#binding-uploaded-files
            form = FileForm(request.POST, request.FILES)
            # check whether it's valid:
            if form.is_valid():
                instance = form.save(commit=False)
                instance.save()
                # redirect to the same URL:
                return HttpResponseRedirect('/App/index/')
        # if a GET (or any other method) we'll create a blank form
        else:
            form = FileForm()
        return render(request, 'index.html', {'form': form})


class FileView(views.APIView):
    parser_classes = (MultiPartParser, FormParser)

    def post(self, request):
        '''This method is used to Make POST requests to save a file in the media folder'''
        file_serializer = FileSerializer(data=request.data)
        if file_serializer.is_valid():
            file_serializer.save()
            return Response(file_serializer.data, status=status.HTTP_201_CREATED)
        else:
            return Response(file_serializer.errors, status=status.HTTP_400_BAD_REQUEST)
from django.db import models


class FileModel(models.Model):
    file = models.FileField()
    timestamp = models.DateTimeField(auto_now_add=True)
from django.forms import ModelForm
from App.models import FileModel


class FileForm(ModelForm):
    # Creating a form that maps to the model: https://docs.djangoproject.com/en/2.2/topics/forms/modelforms/
    class Meta:
        model = FileModel
        fields = ['file']
forms.py

class IndexView(TemplateView):
    template_name = "index.html"
    log = logging.getLogger(__name__)
    log.debug("Debug testing")

    def post(self, request): # TODO: fix, empty file error returned after calling post method
        # if this is a POST request we need to process the form data
        if request.method == 'POST':
            # create a form instance and populate it with data from the request:
            # https://docs.djangoproject.com/en/2.2/ref/forms/api/#binding-uploaded-files
            form = FileForm(request.POST, request.FILES)
            # check whether it's valid:
            if form.is_valid():
                instance = form.save(commit=False)
                instance.save()
                # redirect to the same URL:
                return HttpResponseRedirect('/App/index/')
        # if a GET (or any other method) we'll create a blank form
        else:
            form = FileForm()
        return render(request, 'index.html', {'form': form})


class FileView(views.APIView):
    parser_classes = (MultiPartParser, FormParser)

    def post(self, request):
        '''This method is used to Make POST requests to save a file in the media folder'''
        file_serializer = FileSerializer(data=request.data)
        if file_serializer.is_valid():
            file_serializer.save()
            return Response(file_serializer.data, status=status.HTTP_201_CREATED)
        else:
            return Response(file_serializer.errors, status=status.HTTP_400_BAD_REQUEST)
from django.db import models


class FileModel(models.Model):
    file = models.FileField()
    timestamp = models.DateTimeField(auto_now_add=True)
from django.forms import ModelForm
from App.models import FileModel


class FileForm(ModelForm):
    # Creating a form that maps to the model: https://docs.djangoproject.com/en/2.2/topics/forms/modelforms/
    class Meta:
        model = FileModel
        fields = ['file']
以下是我已经查阅过但未成功的文件:

以下是我在没有找到问题解决方案的情况下已经阅读的stackoverflow问题:

完整代码存储库:

编辑:我在IndexView.post中更改了if语句,如下所示

        if form.is_valid():
            instance = form.save(commit=False)
            instance.save()
现在请求正常,但传递的文件为空

HTTP 201 Created
Allow: POST, DELETE, OPTIONS
Content-Type: application/json
Vary: Accept

{
    "file": null,
    "timestamp": "2019-08-16T06:15:58.882905Z"
}

尝试添加一个dir upload_到您的内部模型字段,也可以在表单中定义您的字段文件,例如file=forms.FileField(),它应该是这样工作的。我猜你正面临着这个问题,从你的表单定义来看。请检查您的表单,如下所示:保持与刚在类Meta之前添加file=forms.FileField()的表单相同: