Empty Request.FILES с форматами загрузки Django
Попытка использовать очень простую форму для загрузки файла в новый экземпляр класса. Я ожидаю иметь оба файла в request.FILES
, но он пуст. Я подключен к серверу dev.
Застрял здесь и прошел через все связанные вопросы.
wayfinder_map.media_file = request.FILES['media_file']
генерирует
MultiValueDictKeyError: "Key_ 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>
Ответы
Ответ 1
Кажется, что запрос .FILES не нужен в этом случае (хорошая вещь, потому что он пуст...)
Я изменил эту строку
wayfinder_map.media_file = request.FILES['media_file']
для
wayfinder_map.media_file = wayfinder_map_form.cleaned_data['media_file']
и он работает. Не уверен, что правильно делать, хотя... -
Ответ 2
старый вопрос, но кто-то еще может найти это полезным.
Чтобы ваши файлы <input type=file>
загружались и показывались в 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>
в противном случае ваши файлы не будут загружены, а ваш запрос. ФАЙЛЫ будут пустыми.
BTW Это общее решение общей ошибки. Тем не менее, я все еще оказался в ситуации с пустым файлом (и файлом в POST), когда все остальное выглядело нормально. У меня такое ощущение, что это ограничение по размеру, но он не хотел тратить больше времени на отладку и просто использовал request.raw_post_data
. Если кто-нибудь пойдет на этот вопрос, добавьте комментарий (включая точную версию django!), И я попытаюсь отлаживать более глубоко.
Ответ 3
Я думаю, что ваши проблемы могут заключаться в назначении данных форме без предварительной проверки запроса 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))