在 django 中保存多个上传的文件

Posted

技术标签:

【中文标题】在 django 中保存多个上传的文件【英文标题】:save multiple uploaded files in django 【发布时间】:2013-12-08 09:41:12 【问题描述】:

我想在我的应用程序中上传和保存多个文件,我有<input type="text" name="name" value="" /> <input type="file" name="file" multiple/> 在我的模板中。当我点击上传时,似乎 form = MyForm(request.POST, request.FILES) 仅保存一个文件,该文件在许多 uloaded 文件列表中的最后一个文件。如何使用form = MyForm(request.POST, request.FILES) blah blah 格式保存所有上传的文件?谢谢

编辑 Myform 是此模型的模型形式。

class Docs(models.Model):    
    name = models.CharField(max_length=128)
    file = models.FileField(max_length=100, upload_to="documents/")

【问题讨论】:

【参考方案1】:

@faksetru 的答案不包括 save() 方法。所以如果你想保存你的实例,它看起来像这样:

# in views.py
from .models import Docs
...
form = MyForm(request.POST, request.FILES)
if form.is_valid():
    name = form.cleaned_data['name']
    for f in request.FILES.getlist('file'):
        instance = Docs(name=name, file=f)
        instance.save()
    return HttpResponse('OK')

更多详情请参考official documentation of Django。

更新:

我写了完整的答案here,请查看。

【讨论】:

【参考方案2】:

您可以在 MyFOrm 中使用 request.FILES['file']request.FILE.get('file')。他们只返回一个文件。

使用request.FILE.getlist('file') 获取多个文件。


在你看来:

....
form = MyForm(request.POST, request.FILES)
if form.is_valid():
    name = form.cleaned_data['name']
    for f in request.FILES.getlist('file'):
        Docs.objects.create(name=name, file=f)
    return HttpResponse('OK')
...

【讨论】:

谢谢@falsetru,如何使用表单保存文件? @AlexKasina,正如我在你的问题中评论的那样,没有MyForm 代码很难回答。 @AlexKasina,定义一个方法save(例如)以某种方式使用request.FILE.getlist。 (我只能这样回答) @AlexKasina,如果上传多个文件,是否要创建多个 Docs 对象? @AlexKasina,我添加了一个代码。我不确定如何使用 ModelForm 来做到这一点。所以我添加了非表单辅助代码。

以上是关于在 django 中保存多个上传的文件的主要内容,如果未能解决你的问题,请参考以下文章

Django保存上传的文件

django 在模型自定义保存中访问上传的文件,最佳实践?

Django:将用户上传保存在单独的文件夹中

如何使用 jquery 和 Ajax 将多个文件字段保存到 django

Django中对于上传的文件的保存方法(时间+文件名)

在 django 中使用相同的输入名称上传多个文件