Django REST FileUpload 序列化器 returns {'file': None}
Django REST FileUpload serializer returns {'file': None}
我一直在做一个需要文件上传的 Django 项目。我在使用 django-rest-framework 的应用程序设计中使用 API 方法。我创建了模型、APIView 和序列化程序,但不幸的是,每次请求通过序列化程序时,upload.datareturns{'file':None}。如果我只是使用 request.FILES['file'] 它 returns 文件没问题,但我想使用序列化数据。我在前端使用 dropzone js 上传文件。下面是我的代码。
HTML
{% extends 'base_profile.html' %}
{% load static %}
{% block title %}File Import{% endblock %}
{% block pagetitle %}File Import{% endblock %}
{% block content %}
<div class="widget">
<div class="widget-heading clearfix">
<h3 class="widget-title pull-left list-inline">CSV </h3>
<button type="button" class="btn btn-primary pull-right"><i class="ti-upload mr-5"></i> Upload</button>
</div>
<div class="widget-body">
<form id="type-dz" class="dropzone">{% csrf_token %}</form>
</div>
</div>
{% endblock %}
{% block js %}
<script type="text/javascript">
$("#type-dz").dropzone({
url: "{% url 'api_import:file' %}",
paramName: "file",
acceptedFiles: ".csv",
maxFilesize: 2,
maxThumbnailFilesize: .5,
dictDefaultMessage: "<i class='icon-dz fa fa-file-text-o'></i>Drop files here to upload"
});
</script>
{% endblock %}
urls.py
urlpatterns = [
url(r'^api/import/', include('api.import_api.urls', namespace="api_import")),
]
api/urls.py
urlpatterns = [
url(r'^file/', FileImport.as_view(), name='file'),
]
views.py
class FileImport(APIView):
parser_classes = (MultiPartParser, FormParser,)
serializer = ImportSerializer
def post(self, request, format=None):
upload = self.serializer(data=request.FILES)
if upload.is_valid():
file = FileUpload(file=upload.data['file'], uploaded_by=request.user.profile)
file.save()
return Response({'success': 'Imported successfully'})
else:
return Response(upload.errors, status=400)
serializers.py
class ImportSerializer(serializers.Serializer):
file = serializers.FileField()
models.py
class FileUpload(models.Model):
file = models.FileField(upload_to='files/%Y/%m/%d')
date_uploaded = models.DateTimeField(auto_now=True)
uploaded_by = models.ForeignKey('UserProfile', blank=True, null=True)
查看您上传文件的方式会很有帮助。如果您正在使用 multipart/form-data 请求并正确地为 "file" 提供 json,最有可能的是文件由于某种原因未能通过验证。
如果可以,从可浏览的 api 进行测试可能也会有所帮助(因为这可以保证您的请求没有任何问题)。
编辑:
问题是调用 is_valid()
.
后应该使用 validated_data
字段而不是 data
字段
我一直在做一个需要文件上传的 Django 项目。我在使用 django-rest-framework 的应用程序设计中使用 API 方法。我创建了模型、APIView 和序列化程序,但不幸的是,每次请求通过序列化程序时,upload.datareturns{'file':None}。如果我只是使用 request.FILES['file'] 它 returns 文件没问题,但我想使用序列化数据。我在前端使用 dropzone js 上传文件。下面是我的代码。
HTML
{% extends 'base_profile.html' %}
{% load static %}
{% block title %}File Import{% endblock %}
{% block pagetitle %}File Import{% endblock %}
{% block content %}
<div class="widget">
<div class="widget-heading clearfix">
<h3 class="widget-title pull-left list-inline">CSV </h3>
<button type="button" class="btn btn-primary pull-right"><i class="ti-upload mr-5"></i> Upload</button>
</div>
<div class="widget-body">
<form id="type-dz" class="dropzone">{% csrf_token %}</form>
</div>
</div>
{% endblock %}
{% block js %}
<script type="text/javascript">
$("#type-dz").dropzone({
url: "{% url 'api_import:file' %}",
paramName: "file",
acceptedFiles: ".csv",
maxFilesize: 2,
maxThumbnailFilesize: .5,
dictDefaultMessage: "<i class='icon-dz fa fa-file-text-o'></i>Drop files here to upload"
});
</script>
{% endblock %}
urls.py
urlpatterns = [
url(r'^api/import/', include('api.import_api.urls', namespace="api_import")),
]
api/urls.py
urlpatterns = [
url(r'^file/', FileImport.as_view(), name='file'),
]
views.py
class FileImport(APIView):
parser_classes = (MultiPartParser, FormParser,)
serializer = ImportSerializer
def post(self, request, format=None):
upload = self.serializer(data=request.FILES)
if upload.is_valid():
file = FileUpload(file=upload.data['file'], uploaded_by=request.user.profile)
file.save()
return Response({'success': 'Imported successfully'})
else:
return Response(upload.errors, status=400)
serializers.py
class ImportSerializer(serializers.Serializer):
file = serializers.FileField()
models.py
class FileUpload(models.Model):
file = models.FileField(upload_to='files/%Y/%m/%d')
date_uploaded = models.DateTimeField(auto_now=True)
uploaded_by = models.ForeignKey('UserProfile', blank=True, null=True)
查看您上传文件的方式会很有帮助。如果您正在使用 multipart/form-data 请求并正确地为 "file" 提供 json,最有可能的是文件由于某种原因未能通过验证。
如果可以,从可浏览的 api 进行测试可能也会有所帮助(因为这可以保证您的请求没有任何问题)。
编辑:
问题是调用 is_valid()
.
validated_data
字段而不是 data
字段