我尝试使用dropzone.js在一个请求中上传多个文件。当我在dropzone中将uploadMultiple
选项设置为true时,会将包含这两个文件的一个请求发送到我的视图,但表单验证失败。
这是我的Django表格:
class UploadForm(forms.Form):
data = forms.IntegerField(widget=forms.HiddenInput())
file = forms.FileField()
我的观点:
def upload(request):
if request.method == 'POST':
form = UploadForm(request.POST, request.FILES)
print request.FILES
if form.is_valid():
for file in request.FILES.getlist('file'):
print str(file)
else:
print form.errors
else:
form = UploadForm(initial={'data': 5})
return render(request, 'upload.html', {
'form': form
})
和我的模板:
<script type="text/javascript">
Dropzone.options.myAwesomeDropzone = {
autoProcessQueue : false,
uploadMultiple: true,
init : function() {
myDropzone = this;
this.element.querySelector("input[type='submit']").addEventListener('click', function(event) {
event.preventDefault();
event.stopPropagation();
myDropzone.processQueue();
});
}
}
</script>
<form id='my-awesome-dropzone' class="dropzone"
action="{% url 'upload.views.upload' %}" method="post" enctype="multipart/form-data">
{% csrf_token %}
{{ form.data }}
<input type="submit" value="Upload" />
</form>
我看到request.FILES
有两个文件:
<MultiValueDict: {u'file[]': [<InMemoryUploadedFile: Forest Flowers.jpg (image/jpeg)>,
<InMemoryUploadedFile: Forest.jpg (image/jpeg)>]}>
我想问题是Django没有认识file[]
。它预计会file
。如何让Django识别这两个上传文件?
答案 0 :(得分:0)
你只需要这样做:
file1 = request.FILES.get(file[][0], None) # For the first file
file2 = request.FILES.get(file[][1], None) # For the second file
......等等......
希望有所帮助。
答案 1 :(得分:0)
您是正确的假设验证错误是由于输入名称dropzone.js发送到服务器而产生的。 &#34;文件[n]&#34;当您的Django表单期望一个名为&#34; file&#34;的字段时抛出验证错误(必填字段)。
在Dropzone.js中,您可以指定参数&#34; paramName&#34;并且此object属性也接受函数而不是简单字符串,因此如果将paramName设置为:
...
paramName: function(){
return "file";
}
...
发送到服务器的字段名称没有改变,你得到一个&#34;文件&#34; request.FILES中的字段,它是一个带有一个元素(文件)的字典,它是一个预期的文件数组。