【问题标题】:Django + dropzone.js: form validation fails for multiple filesDjango + dropzone.js:多个文件的表单验证失败
【发布时间】:2013-12-22 06:54:42
【问题描述】:

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

【问题讨论】:

  • 您绝对可以进行多文件上传。过去我用 dropzone 和 django 做到了这一点,但是我现在不在办公室,所以我无法复制代码的重要方面来给你提示。我记得我是从这篇文章开始开发的:mechanicalgirl.com/post/… - 它应该回答你的最后一个问题
  • 你可以用这个for file in request.FILES.getlist('file[]'): print str(file)
  • @furins ,我已经使用 django 模板实现了 dropzone,但是图像没有在服务器端上传。你能建议我出了什么问题吗?我也浏览了你提到的链接也
  • @MegaBytes:你得到一个特定的错误吗?你有一些我可以查看的代码来重现它吗?最后,如果它与 user2233706 或mechanicalgirl 的不同,请考虑打开一个新问题。
  • @furins, MultiValueDictKeyError at /saveimages/ 并说请求中没有文件数据,是的,我用代码 sn-p 提出了一个新问题。

标签: django dropzone.js


【解决方案1】:

您是正确的假设验证错误是由于输入名称 dropzone.js 发送到服务器而引起的。当您的 Django 表单需要一个名为“file”的字段时,“file[n]”模式会引发验证错误(必填字段)。

在 Dropzone.js 中,您可以指定参数“paramName”,并且此对象属性还接受一个函数而不是简单的字符串,因此如果您将 paramName 设置为:

...
paramName: function(){
    return "file";
}
...

发送到服务器的字段名称不会更改,并且您会在 request.FILES 中获得一个“文件”字段,它是一个带有一个元素(文件)的字典,它是预期的文件数组。

【讨论】:

    【解决方案2】:

    你只需要这样做:

    file1 = request.FILES.get(file[][0], None)  # For the first file
    file2 = request.FILES.get(file[][1], None)  # For the second file
    

    ……等等……

    希望对您有所帮助。

    【讨论】:

      猜你喜欢
      • 2017-01-25
      • 2016-04-21
      • 2011-03-07
      • 2014-04-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-24
      • 2017-11-19
      相关资源
      最近更新 更多