Django表单多个文件字段

16 投票
3 回答
17978 浏览
提问于 2025-04-16 16:10

在Django中,如何处理多个文件字段呢?比如说,如果我只有一个文件输入框,我会把请求中的文件通过request.FILES['file']传给处理函数。但是当有多个文件的时候,该怎么做呢?

3 个回答

1

这里有一个不错的链接可以参考这个答案:https://github.com/Chive/django-multiupload。不过,因为我没有使用ModelForm,所以我做了一些修改。
在视图中,我写了下面的代码,并把文件保存到了磁盘上:

for each in form.cleaned_data['attachments']:
    handle_uploaded_file(each)

def uploadMyWork(request):
    from .forms import UploadFileForm, handle_uploaded_file
    print 'in uploadMyWork'

    if request.method == 'GET':
        print 'in uploadMyWork : GET'
        form = UploadFileForm()
    else:
        form = UploadFileForm(request.POST, request.FILES)
        print 'in uploadMyWork : POST'
        #for each in form.cleaned_data['attachments']:
        #    handle_uploaded_file(each)
        #return render(request, 'stitchme/uploadMyWork.html', {'msg': "file uploaded successfully"})

        if form.is_valid():
             print 'inside form valid'
             for each in form.cleaned_data['attachments']:
                 handle_uploaded_file(each)
             return render(request, 'stitchme/uploadMyWork.html', {'msg': "file uploaded successfully"})

    print 'returning to uploadmywork'
    return render(request, 'stitchme/uploadMyWork.html', {'form': form, 'msg':'hi'})
9

request.FILES.get('filename', None) 是用来检查一个表单中是否有名为 'filename' 的文件字段的。

<input type="file" name="filename"></input>

如果你有两个这样的文件字段:

<input type="file" name="file1"></input>
<input type="file" name="file2"></input>

那么 request.FILES.get('file1', None)request.FILES.get('file2', None) 就会分别返回这两个文件。

这样做的原因是因为使用了多部分的 MIME 格式。上传的内容分为三部分(表单数据、file1、file2),Django 的 UploadFileHandler 会把这些内容分开,分别放到 request.POSTrequest.FILES 中。

35

我虽然来得有点晚,但我一直在努力搞明白这个问题,终于找到了一个解决办法。你可以看看这里用的代码:https://code.djangoproject.com/ticket/12446

你可以用 getlist 来获取多部分的值。如果我的 HTML 表单是:

<form enctype="multipart/form-data" action="" method="post">
<input type="file" name="myfiles" multiple>
<input type="submit" name="upload" value="Upload">
</form>

那么我处理它的 Django 代码看起来会是:

for afile in request.FILES.getlist('myfiles'):
    # do something with afile

接下来,我要写一个表单字段/小部件来正确处理这个问题。我对 Django 还是比较陌生,所以我在边学边做。

撰写回答