Django表单多个文件字段
在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.POST
和 request.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 还是比较陌生,所以我在边学边做。