【问题标题】:django REST framework: HTML form returns filename instead of filedjango REST框架:HTML表单返回文件名而不是文件
【发布时间】:2016-04-07 15:16:22
【问题描述】:

我有这个 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')

问题是表单上传的不是文件而是文件名,比较两个文件时出现类型错误。如何让表单改为上传文件?

【问题讨论】:

    标签: django django-rest-framework


    【解决方案1】:

    您应该从请求对象中的 FILES QueryDict 中提取文件,而不是 POST。例如:

    self.request.FILES['submittedFile']
    

    或者django-rest-framework方式:

    request.data['submittedFile']
    

    更多解释请查看: http://www.django-rest-framework.org/api-guide/parsers/#fileuploadparser

    编辑:还将表格更改为:

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

    并将视图提交到:

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

    【讨论】:

    • 没有多大帮助,request.FILES 是一个空字典,request.data['submittedFile'] 抛出同样的错误。如果我按照文档中的说明添加 parser_classes = (FileUploadParser,),每次上传都会收到 400 个错误请求
    • 改用 MultiPartParser 并确保在您的表单上正确设置请求的内容类型,如下所示:&lt;form method="post" enctype="multipart/form-data"&gt;
    • 仍然抛出415 unsupported media type,但只能通过浏览器。如果我在邮递员中构造一个请求,它就会通过。
    • 我测试了你的代码,它同时适用于 request.FILES 和 request.data。我已更新我的答案以澄清上述更改。如果它们与您的代码匹配,也许在点击提交之前就从浏览器共享您的 html 标记?
    • 实际上,我很愚蠢,在某处打错了字。感谢您的帮助!
    猜你喜欢
    • 2014-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-21
    • 1970-01-01
    • 2020-11-23
    • 2015-10-04
    • 2013-12-26
    相关资源
    最近更新 更多