10

I want to upload and save multiple files in my application, I have
<input type="text" name="name" value="" />
<input type="file" name="file" multiple/>

in my template. when I hit upload, seems
form = MyForm(request.POST, request.FILES)
is only saving one file which is last in the list of the many uloaded files. How can I be able to save all the uploaded files using the form form = MyForm(request.POST, request.FILES) blah blah? Thanks

Edit
Myform is a model form from this model.

class Docs(models.Model):    
    name = models.CharField(max_length=128)
    file = models.FileField(max_length=100, upload_to="documents/")
falsetru
  • 357,413
  • 63
  • 732
  • 636
Alexxio
  • 1,091
  • 3
  • 16
  • 38

2 Answers2

13

You maybe use request.FILES['file'] or request.FILE.get('file') in MyFOrm. They only return a file.

Use request.FILE.getlist('file') to get multiple files.


In your view:

....
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
  • 357,413
  • 63
  • 732
  • 636
4

The answer of @faksetru does not include save() method. So if you want to save your instace, it looks like this:

# 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')

For the more details refer to official documentation of Django.

UPDATE:

I wrote a full answer here, please check it out.

Community
  • 1
  • 1
karjaubayev
  • 571
  • 5
  • 10