带有Django上传表单的空Request.FILES

尝试使用非常简单的形式将文件上传到新的类实例中。 我希望两个文件都在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>
philgo20 asked 2020-08-09T23:16:52Z
4个解决方案
181 votes

这个古老的问题,但仍然有人会觉得这很有用。

为了使您的request.raw_post_data文件上传并显示在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 answered 2020-08-09T23:17:11Z
3 votes

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

我修改了这条线

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

对于

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

而且有效。 尽管不确定做某事的正确方法……–

philgo20 answered 2020-08-09T23:17:44Z
0 votes

我认为您的麻烦可能在于将数据分配给表单而未先验证请求是否为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))
czarchaic answered 2020-08-09T23:18:04Z
0 votes

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

    {% 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 %}
Gregory Presser answered 2020-08-09T23:18:24Z
translate from https://stackoverflow.com:/questions/2010747/empty-request-files-with-django-upload-forms