2010-01-06 3 views
30

매우 간단한 양식을 사용하여 파일을 새 클래스 인스턴스에 업로드하려고합니다. request.FILES에 두 파일을 모두 갖길 기대하지만 비어 있습니다. 나는 번들 된 dev 서버에있다.빈 Request.FILES with Django 업로드 양식

여기에 붙어서 모든 관련 질문을 수행했습니다.

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 –

답변

2

이 경우 필요하지 않습니다이다

을 (좋은 일이 ... 그것은 비어의 원인이) 나는이 줄을 수정

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

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

에 대한

과 작동합니다. 어떤 일을 할 올바른 방법인지 모르겠다. -

0

그것은 request.FILES으로 보인다 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

지금까지 아무런 문제없이이 방법을 사용해 왔습니다. 좋은 체크 (필요할 경우) 수 있지만 확실히 요청으로 문제를 해결하지 않습니다. 파일은 여전히 ​​비어 있습니다. – philgo20

+0

'지금까지 문제 없음'을 의미합니까? 이전에 제대로 작동 했습니까? 양식 클래스를 게시 할 수 있습니까? – czarchaic

+0

내가 무슨 뜻인지는 내가 폼을 POST없이 사용 하는지를 확인하지 않고 request.FILES를 사용할 필요가없는 한 문제없이 폼을 사용했다는 것이다. 묶는 것이 필요합니까?당신이 도움이 될 수있는 클래스의 인스턴스 생성에서 데이터 POST? 나는 그것을 시도하고 나의 양식을 게시 할 것입니다. – philgo20

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 일반적인 오류에 대한 일반적인 해결책입니다. 그럼에도 불구하고, 나는 빈 파일 (그리고 POST의 파일)이있는 상황에서 여전히 다른 것을 찾았을 때마다 자신을 발견했습니다. 크기 제한이지만 디버깅에 더 많은 시간을 보내고 싶지 않은 느낌이 들었고 단지 request.raw_post_data을 사용했습니다. 혹시 누군가가이 문제에 빠지면 주석을 달아주세요. (정확한 장고 버전 포함!) 나는 더 깊이 디버깅하려고 노력할 것입니다.

+0

넵, 그게 내 문제를 해결했습니다 - 덕분에 –

+14

나는 이것이 받아 들인 해결책이 아닌 이유를 모른다. ... – Cerin

+3

그것은 저자 문제를 해결하지 못하기 때문에. – haudoing