2010-01-06 5 views
30

Пытается использовать очень простую форму для загрузки файла в экземпляр нового класса. Я ожидаю иметь оба файла в request.FILES, но он пуст. Я подключен к серверу dev.Empty Request.FILES with Django Upload forms

Застрял здесь и прошел все связанные вопросы.

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

Кажется, 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

+0

Что значит «проблем нет»? Раньше это работало? Можете ли вы опубликовать свой класс формы? – czarchaic

+0

Я имею в виду, что я использовал формы без проблем, если мне не нужно использовать request.FILES, не проверяя, является ли метод POST. Выполняет привязку запроса.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. Если когда-нибудь кто-нибудь попадет на этот вопрос, добавьте комментарий (включая точную версию django!), И я попытаюсь отлаживать более глубоко.

+0

yup, эта исправлена ​​моя проблема - спасибо –

+14

Не знаю, почему это не принятое решение ... – Cerin

+3

Потому что это не решает проблему авторов. – haudoing