Django + dropzone.js:多个文件的表单验证失败

时间:2013-12-22 06:54:43

标签: django dropzone.js

我尝试使用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识别这两个上传文件?

2 个答案:

答案 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中的字段,它是一个带有一个元素(文件)的字典,它是一个预期的文件数组。