2016-10-06 4 views
0

파일 업로드가 필요한 Django 프로젝트에서 작업 해 왔습니다. Django-rest-framework을 사용하는 앱 디자인에서 API 접근법을 사용합니다. 내 모델, APIView 및 serializer를 만들었지 만 불행히도 요청이 serializer를 통과 할 때마다 upload.data는 { 'file': None}을 반환합니다. 난 그냥 request.FILES [ '파일'] 파일을 아무 문제없이 반환하는 있지만 serialize 된 데이터를 사용하려는 경우 사용합니다. 나는 파일을 업로드하기 위해 프론트 엔드에 dropzone js를 사용하고있다. 여기에 내 코드가있다.Django REST FileUpload serializer가 { 'file': None}을 반환합니다.

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) 
+0

['FileUploadParser'] (http://www.django-rest-framework.org/api-guide/parsers/#fileuploadparser)를 사용해야합니다. –

답변

3

당신이 파일을 업로드하는 방법을보고 도움이 될 것입니다. multipart/form-data 요청을 사용하고 "file"에 대한 json을 제대로 제공하는 경우 가장 가능성있는 것은 파일이 어떤 이유로 유효성 검사에 실패하는 것입니다.

가능한 경우 브라우저 API에서 테스트하는 것이 도움이 될 수 있습니다 (사용자의 요청에 아무런 문제가 없음을 보장).

편집 :
문제는 validated_data 필드가 is_valid()를 호출 한 후 data 필드 대신에 사용되어야한다고했다.

+0

dropzone js를 사용하고 있습니다. 프런트 엔드에 내 코드가 포함 된 초기 게시물을 업데이트했습니다. – ssk

+0

multipart/form-data를 올바르게 업로드해야합니다. 'upload.validated_data [ 'file']'을 (를) 보았습니까? 이것은 일반적으로'is_valid()'를 호출 한 후에 시리얼 라이저 데이터에 접근하는 방법입니다. –

+0

고맙습니다, 그게 다야! 나는 잘못된 방식으로 직렬화 된 데이터에 액세스하고있었습니다. – ssk

관련 문제