【问题标题】:Empty Request.FILES with Django Upload forms使用 Django 上传表单清空 Request.FILES
【发布时间】:2011-01-01 22:00:18
【问题描述】:

尝试使用非常简单的表单将文件上传到新的类实例中。我希望这两个文件都在request.FILES 中,但它是空的。我在捆绑的开发服务器上。

被困在这里并解决了所有相关问题。

wayfinder_map.media_file = request.FILES['media_file'] 

生成

MultiValueDictKeyError:“在 MultiValueDict 中找不到键‘media_file’: {}>"

型号

class WayfinderMap(models.Model):
    """ Way-finding Map Config"""


    media_file = models.FileField(upload_to="maps", null=True, blank=True) 
    wall_file = models.FileField(upload_to="maps_data", null=True, blank=True) 

查看

@login_required
def create_map(request, form_class=WayfinderMapForm, template_name="wayfinder/map/create.html"):
wayfinder_map_form = form_class(request.user, request.POST or None, request.FILES)

    if wayfinder_map_form.is_valid():
        wayfinder_map = wayfinder_map_form.save(commit=False)
        wayfinder_map.media_file = request.FILES['media_file']
        wayfinder_map.data_file = request.FILES['data_file']
        wayfinder_map.creator = request.user
        wayfinder_map.save()
    return HttpResponseRedirect(wayfinder_map.get_absolute_url())

return render_to_response(template_name, {
    "wayfinder_map_form": wayfinder_map_form,
}, context_instance=RequestContext(request))

模板

<form enctype="multipart/form-data" class="uniForm" id="wayfinder_map_form" method="POST" action="">
        <fieldset class="inlineLabels">
            {{ wayfinder_map_form|as_uni_form }}
            <div class="form_block">
                <input type="hidden" name="action" value="create" />
                <input type="submit" value="{% trans 'create' %}"/>
            </div>
        </fieldset>
    </form>

【问题讨论】:

标签: django django-forms


【解决方案1】:

老问题,但有人可能仍然觉得这很有用。

为了让您的 &lt;input type=file&gt; 文件上传并显示在 request.FILES 中,您的表单必须包含 enctype="multipart/form-data",例如:

<form action="" method="post" enctype="multipart/form-data">{% csrf_token %}
{{ form.as_p }}
<button type="submit">{% trans 'Submit' %}</button>
</form>

否则您的文件将不会上传,并且您的 request.FILES 将为空。

顺便说一句这是一个常见错误的常见解决方案。尽管如此,当其他一切看起来都正常时,我仍然发现自己处于一个空文件(以及 POST 中的文件)的情况。我觉得这是一个大小限制,但不想花更多时间调试,只是使用了request.raw_post_data。如果有人遇到这个问题,请添加评论(包括精确的 django 版本!),我会尝试更深入地调试。

【讨论】:

  • @Stefano:我也遇到过这个问题。 (使用 django 1.6,python 3.3)我已经设置了加密类型和其他东西,但我的 request.FILES 仍然是空的。
  • @alireza,即使您不是“支持”站点,您也可以尝试粘贴配置的细节,或者如果是操作系统,则粘贴代码链接,否则很难猜出您的问题是什么...
  • 当您对框架如此盲目时,总是会忘记像这样简单的事情。谢谢!
  • jQuery Mobile 还有requires: data-ajax="false"
  • 请注意,从 1.6 开始,request.raw_post_data 现在是 request.body
【解决方案2】:

在这种情况下似乎不需要 request.FILES (好事,因为它是空的......)

我修改了这一行

wayfinder_map.media_file = request.FILES['media_file'] 

wayfinder_map.media_file = wayfinder_map_form.cleaned_data['media_file'] 

它有效。虽然不确定什么是正确的做事方式...... -

【讨论】:

    【解决方案3】:

    我的问题是我缺少文件输入的“名称”属性。

    【讨论】:

    • 是的,确实,我使用我的自定义表单,而不是 django 表单,并且需要 name 属性。但我怎么知道呢?)
    【解决方案4】:

    我发现如果你把表单放在内容块中,那么它似乎可以工作

        {% block content %}
    <form enctype="multipart/form-data" class="uniForm" id="wayfinder_map_form" method="POST" action="">
            <fieldset class="inlineLabels">
                {{ wayfinder_map_form|as_uni_form }}
                <div class="form_block">
                    <input type="hidden" name="action" value="create" />
                    <input type="submit" value="{% trans 'create' %}"/>
                </div>
            </fieldset>
        </form>
    {% endblock %}
    

    【讨论】:

      【解决方案5】:

      我知道这是一个老问题,但它是谷歌上“django request.file empty”的第一个结果,所以我想在搜索两天后添加一个潜在的解决方案:

      如果您通过 ajax 提交文件,请确保通过 formData() 而不是 form.serialize() 发送表单

      参见此处:Django JQuery Ajax File Upload

      【讨论】:

        【解决方案6】:

        我认为您的麻烦可能在于将数据分配给表单而不首先验证请求是POST

        @login_required
        def create_map(request, form_class=WayfinderMapForm, template_name="wayfinder/map create.html"):
          if request.method=='POST':
            wayfinder_map_form = form_class(request.user, data=request.POST, files=request.FILES)
        
            if wayfinder_map_form.is_valid():
              #save your data
              return HttpResponseRedirect(wayfinder_map.get_absolute_url())
        
          else:
            wayfinder_map_form=form_class(request.user)
        
         return render_to_response(template_name, {"wayfinder_map_form": wayfinder_map_form,}, context_instance=RequestContext(request))
        

        【讨论】:

        • 目前一直以这种方式使用它,没有任何问题。可能是一个很好的检查(如有必要),但它肯定不能解决问题,因为 request.FILES 仍然是空的
        • “到目前为止没有问题”是什么意思?这以前工作正常吗?你能发布你的表单类吗?
        • 我的意思是我一直在使用表单没有问题,只要我不必使用request.FILES,而不检查方法是否为POST。像您一样将 request.POST 绑定到类实例化中的数据会有所帮助吗?我会尝试并发布我的表格。
        猜你喜欢
        • 2011-11-09
        • 2015-04-12
        • 2021-06-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-06-15
        • 2018-12-30
        • 1970-01-01
        相关资源
        最近更新 更多