2016-10-06 7 views
0

私はファイルアップロードが必要なDjangoプロジェクトに取り組んでいます。私はdjango-rest-frameworkを使って自分のアプリデザインでAPIアプローチを使用しています。モデル、APIView、シリアライザを作成しましたが、残念ながらリクエストがシリアライザを経由するたびにupload.dataは{'file':None}を返します。私は単にrequest.FILES ['file']を使ってファイルを返しても問題はないが、シリアライズされたデータを使いたい。私はファイルをアップロードするためにフロントエンドにdropzone jsを使用しています。以下は私のコードです。Django REST FileUploadシリアライザは{'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

関連する問題