Zygro
Zygro

Reputation: 7119

django REST framework: HTML form returns filename instead of file

I have this HTML template

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

this serializer

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

and this view

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')

Problem is that the form uploads not the file but its name and I get type error when comparing the two files. How do I make the form upload the file instead?

Upvotes: 0

Views: 512

Answers (1)

fips
fips

Reputation: 4379

You should extract the file from the FILES QueryDict in the request object, not POST. e.g.:

self.request.FILES['submittedFile']

Or the django-rest-framework way:

request.data['submittedFile']

For more explanation check out: http://www.django-rest-framework.org/api-guide/parsers/#fileuploadparser

EDIT: Also change form to:

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

And SubmitView to:

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

Upvotes: 2

Related Questions