2010-01-06 78 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

相關問題