2016-04-07 8 views
0

のファイル名を返します。私は、このHTMLテンプレートを持っているジャンゴRESTフレームワーク:HTMLフォームではなく、ファイル

<html><body> 
<form method="POST"> 
    {% render_form submitSerializer %} 
    <input type="submit" value="Save"> 
</form> 
</body></html> 

このシリアライザ

class SubmitSerializer(serializers.ModelSerializer): 
    submittedFile = serializers.FileField() 
    class Meta: 
     model = Submit 
     fields = {'submittedFile', 'result'} 
     read_only_fields = {'result'} 

と、このビュー

class SubmitView(APIView): 
    renderer_classes = [renderers.TemplateHTMLRenderer] 

    def get(self, request, *args, **kwargs): 
     return Response({'submitSerializer':submitSerializer}, template_name='singlelesson.html') 

    def post(self, request, *args, **kwargs): 
     submit = Submit(lesson=lessonInstance, user=self.request.user, submittedFile = self.request.data['submittedFile']) 
     serializer = SubmitSerializer(submit) 

     #compare_files returns true if two files contain same text 
     result = compare_files(correct_solution, self.request.POST.get('submittedFile')) 

     serializer.save(result = result) 
     return Response({'submitSerializer':serializer}, template_name='singlelesson.html') 

問題はそのフォームでありますファイルをアップロードするのではなく名前をアップロードして、2つのファイルを比較するときにタイプエラーが発生します。フォームでファイルをアップロードするにはどうしたらいいですか?

答えて

2

ファイルは、POSTではなく要求オブジェクト内のFILES QueryDictから抽出する必要があります。例えば:

self.request.FILES['submittedFile'] 

またはジャンゴ・休息・フレームワークの道:

request.data['submittedFile'] 

以上説明については、チェックアウト: http://www.django-rest-framework.org/api-guide/parsers/#fileuploadparser

EDIT:

<html><body> 
<form method="POST" enctype="multipart/form-data"> 
    {% render_form submitSerializer %} 
    <input type="submit" value="Save"> 
</form> 
</body></html> 
もにフォームを変更

SubmitView o:

class SubmitView(APIView): 
    parser_classes = (MultiPartParser,) 
... 
+0

'request.FILES'は空の辞書であり、' request.data ['submittedFile'] 'は同じエラーを投げます。ドキュメントで述べたように 'parser_classes =(FileUploadParser、)'を追加すると、アップロードごとに400の悪い要求が返される – Zygro

+1

MultiPartParserを使用し、リクエストのコンテンツタイプが以下のようにフォームに正しく設定されていることを確認します: '< form = "post" enctype = "multipart/form-data">「 – fips

+0

はまだ415のサポートされていないメディアタイプを投げます。私が郵便配達所でリクエストを作成すると、それは通過します。 – Zygro

関連する問題