Django REST FileUpload 序列化程序返回 {'file': None}

ssk*_*ssk 3 python django django-serializer django-rest-framework

我\xe2\x80\x99一直在开发一个需要文件上传的Django项目。我在使用 django-rest-framework 的应用程序设计中使用 API 方法。我创建了模型、APIView 和序列化器,但不幸的是,每次请求通过序列化器时,upload.data 都会返回 {\'file\': None}。如果我只使用 request.FILES[\'file\'] 它返回文件没有问题,但我想使用序列化数据。我在前端使用 dropzone js 上传文件。下面是我的代码。

\n\n

超文本标记语言

\n\n
{% extends \'base_profile.html\' %}\n{% load static %}\n{% block title %}File Import{% endblock %}\n{% block pagetitle %}File Import{% endblock %}\n{% block content %}\n<div class="widget">\n    <div class="widget-heading clearfix">\n      <h3 class="widget-title pull-left list-inline">CSV </h3>\n      <button type="button" class="btn btn-primary pull-right"><i class="ti-upload mr-5"></i> Upload</button>\n    </div>\n    <div class="widget-body">\n      <form id="type-dz" class="dropzone">{% csrf_token %}</form>\n    </div>\n</div>\n\n{% endblock %}\n{% block js %}\n<script type="text/javascript">\n    $("#type-dz").dropzone({\n        url: "{% url \'api_import:file\' %}",\n        paramName: "file",\n        acceptedFiles: ".csv",\n        maxFilesize: 2,\n        maxThumbnailFilesize: .5,\n        dictDefaultMessage: "<i class=\'icon-dz fa fa-file-text-o\'></i>Drop files here to upload"\n});\n</script>\n{% endblock %}\n
Run Code Online (Sandbox Code Playgroud)\n\n

urls.py

\n\n
urlpatterns = [\n    url(r\'^api/import/\', include(\'api.import_api.urls\', namespace="api_import")),\n]\n
Run Code Online (Sandbox Code Playgroud)\n\n

api/urls.py

\n\n
urlpatterns = [\n    url(r\'^file/\', FileImport.as_view(), name=\'file\'),\n]\n
Run Code Online (Sandbox Code Playgroud)\n\n

视图.py

\n\n
class FileImport(APIView):\n    parser_classes = (MultiPartParser, FormParser,)\n    serializer = ImportSerializer\n\n    def post(self, request, format=None):\n        upload = self.serializer(data=request.FILES)\n\n        if upload.is_valid():\n            file = FileUpload(file=upload.data[\'file\'], uploaded_by=request.user.profile)\n            file.save()\n            return Response({\'success\': \'Imported successfully\'})\n        else:\n            return Response(upload.errors, status=400)\n
Run Code Online (Sandbox Code Playgroud)\n\n

序列化器.py

\n\n
class ImportSerializer(serializers.Serializer):\n    file = serializers.FileField()\n
Run Code Online (Sandbox Code Playgroud)\n\n

模型.py

\n\n
class FileUpload(models.Model):\n    file = models.FileField(upload_to=\'files/%Y/%m/%d\')\n    date_uploaded = models.DateTimeField(auto_now=True)\n    uploaded_by = models.ForeignKey(\'UserProfile\', blank=True, null=True)\n
Run Code Online (Sandbox Code Playgroud)\n

Jon*_*rds 6

了解您如何上传文件会很有帮助。如果您使用 multipart/form-data 请求并正确提供“file”的 json,最有可能的是该文件由于某种原因未能通过验证。

如果可以的话,从可浏览的 api 进行测试也可能会有所帮助(因为这可以保证您的请求没有任何问题)。

编辑:
问题是validated_data应该使用该字段而不是 data调用后的字段is_valid()