2010-01-06 47 views
30

试图用一个非常简单的形式将文件上传到一个新的类实例。我期待在request.FILES中有两个文件,但它是空的。我在捆绑的开发服务器上。Django的上传空Request.FILES形成

被困在这里,并通过所有相关的问题去了。

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

生成

MultiValueDictKeyError: "Key 'media_file' not found in MultiValueDict: {}>"

模型

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> 
+0

我认为回答这个类似的问题会帮助你:http://stackoverflow.com/q/5895588/1037459 – 2011-11-09 11:05:00

回答

2

它似乎request.FILES没有必要在这种情况下, (好东西导致它的空...)

我修改了这一行

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

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

和它的作品。不知道什么是正确的方式做事情,但... -

0

我觉得你的麻烦可能在于没有首先验证请求分配数据的形式为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)) 
+0

在使用它,这种方式没有问题为止。可能是一个很好的检查(如果有必要),但它肯定无法解决问题,因为request.FILES仍然是空的 – philgo20 2010-01-06 05:59:43

+0

你是什么意思'目前没有问题'?这之前工作正常吗? 你可以发布你的表单类吗? – czarchaic 2010-01-06 14:08:03

+0

我的意思是,我一直在使用没有问题的表单,只要我不必使用request.FILES,而不检查方法是否为POST。绑定请求。像你这样在类的实例化中对数据进行POST可能会有所帮助?我会尝试并发布我的表单。 – philgo20 2010-01-07 14:22:02

140

老问题,但有人仍可能发现这很有用。

为了让上传了<input type=file>文件和showns在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将是空的。

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

+0

是的,这解决了我的问题 - 谢谢 – 2012-07-18 18:36:48

+14

我不知道为什么这不是可接受的解决方案... – Cerin 2012-08-16 19:39:47

+3

因为它不能解决作者的问题。 – haudoing 2013-05-16 10:32:04