尝试使用非常简单的表单将文件上传到新的类实例中。我希望request.FILES
中有两个文件,但它是空的。我在捆绑的开发服务器上。
被困在这里并经历了所有相关问题。
wayfinder_map.media_file = request.FILES['media_file']
产生
MultiValueDictKeyError:在MultiValueDict中找不到“密钥'media_file': {}>“中
模型
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 :(得分:171)
为了让您的<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>
否则您的文件将不会上传,您的request.FILES将为空。
BTW 这是常见错误的常见解决方案。尽管如此,当其他一切看起来还不错的时候,我仍然发现自己处于一个空文件(以及POST中的文件)的情况。我觉得这是一个大小限制,但不想花更多时间调试,只是使用request.raw_post_data
。如果有人关注这个问题,请添加评论(包括精确的django版本!),我会尝试更深入地调试。
答案 1 :(得分:3)
看起来像request.FILES在这种情况下是不必要的(好东西导致它是空的......)
我修改了这一行
wayfinder_map.media_file = request.FILES['media_file']
代表
wayfinder_map.media_file = wayfinder_map_form.cleaned_data['media_file']
它有效。不知道做正确的事情是什么...... -
答案 2 :(得分:2)
我的问题是我缺少文件输入的“名称”属性。
答案 3 :(得分:1)
我知道这是一个老问题,但这是google上“ django request.file空”的第一个结果,因此我想在搜索两天后添加一个潜在的解决方案:
如果您通过ajax提交文件,请确保通过formData()
而不是form.serialize()
发送表单
答案 4 :(得分: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))
答案 5 :(得分:0)
我发现,如果您将表单放在内容块中,那么它似乎可以工作
{% 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 %}