使用Django上传表单清空Request.FILES

phi*_*o20 43 django django-forms

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

被困在这里并经历了所有相关问题.

wayfinder_map.media_file = request.FILES['media_file'] 
Run Code Online (Sandbox Code Playgroud)

生成

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) 
Run Code Online (Sandbox Code Playgroud)

视图

@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))
Run Code Online (Sandbox Code Playgroud)

模板

<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>
Run Code Online (Sandbox Code Playgroud)

Ste*_*ano 182

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

为了将您的<input type=file>文件上传并在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>
Run Code Online (Sandbox Code Playgroud)

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

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

  • 因为它没有解决作者的问题. (4认同)
  • jQuery Mobile也[要求](http://demos.jquerymobile.com/1.4.5/forms/):`data-ajax ="false"` (4认同)
  • 请注意,`request.raw_post_data`现在是`request.body`,从1.6开始 (2认同)

phi*_*o20 4

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

\n\n

我修改了这一行

\n\n
wayfinder_map.media_file = request.FILES['media_file'] \n
Run Code Online (Sandbox Code Playgroud)\n\n

为了

\n\n
wayfinder_map.media_file = wayfinder_map_form.cleaned_data['media_file'] \n
Run Code Online (Sandbox Code Playgroud)\n\n

它有效。但不确定正确的做法是什么... \xe2\x80\x93

\n