Пустой запрос. ФАЙЛЫ с Django Загрузить формы - PullRequest
42 голосов
/ 06 января 2010

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

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

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

создает

MultiValueDictKeyError: "Ключ 'media_file' не найден в 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>

Ответы [ 4 ]

175 голосов
/ 06 апреля 2011

старый вопрос, но кто-то может все еще найти это полезным.

Для того, чтобы ваши <input type=file> файлы загружались и отображались в запросе. ФАЙЛЫ, ваша форма ДОЛЖНА содержать enctype="multipart/form-data", например:

<form action="" method="post" enctype="multipart/form-data">{% csrf_token %}
{{ form.as_p }}
<button type="submit">{% trans 'Submit' %}</button>
</form>

в противном случае ваши файлы не будут загружены, а ваш запрос. ФАЙЛЫ будут пустыми.

BTW Это частое решение распространенной ошибки. Тем не менее, я все еще оказался в ситуации с пустыми ФАЙЛАМИ (и файлом в POST), когда все остальное выглядело нормально. У меня такое ощущение, что это был предел размера, но я не хотел тратить больше времени на отладку, а просто использовал request.raw_post_data. Если кто-нибудь столкнется с этой проблемой, пожалуйста, добавьте комментарий (включая точную версию django!), И я постараюсь отладить более глубоко.

3 голосов
/ 08 января 2010

Это похоже на request.FILES в этом случае не требуется (хорошая вещь, потому что он пуст ...)

Я изменил эту строку

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

для

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

и это работает. Не уверен, что правильно делать что-то ... -

0 голосов
/ 11 ноября 2018

Я обнаружил, что если вы поместите форму в блок контента, значит, она работает

    {% block content %}
<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>
{% endblock %}
0 голосов
/ 06 января 2010

Я думаю, что ваши проблемы могут заключаться в назначении данных для формы без предварительной проверки запроса 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))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...