Django中任意数量的文件上传
怎样才能让用户在Django中上传任意数量的文件呢?
如果我知道用户最多只能上传两个文件,那我可以在我的 forms.py
文件里这样做...
from django import forms
class UploaderForm(forms.Form):
file1 = forms.FileField(upload_to='user_files')
file2 = forms.FileField(upload_to='user_files')
...然后在我的 views.py
文件里这样做...
...
if request.method == 'POST':
form = UploaderForm(request.POST)
if form.is_valid():
form.save()
# do something.
else:
form = UploaderForm()
...
但是,我打算在前端使用JavaScript,让用户可以不断添加新的 <input type="file" name="fileN" />
输入框(其中N是添加到页面上的第N个文件上传框)。用户可以选择上传一个或多个文件。
有没有办法使用Django自带的表单来实现这个功能呢?
如果我猜得没错,我可能无法利用Django表单来生成这些输入框,那我能否使用Django的验证功能?也就是说,能够直接访问 form.cleaned_data['file0']
、form.cleaned_data['file1']
等,而不需要自己去做验证,这样会方便很多。
谢谢。
1 个回答
3
表单集合正是你需要的东西。
http://docs.djangoproject.com/en/dev/topics/forms/formsets/#formsets
你只需要在你的JavaScript中按照表单集合使用的字段命名格式来命名,比如用 'form-0-field'
,而不是 fileN
。
还要相应地修改 form-TOTAL_FORMS
。查看文档吧,里面对此的解释特别详细。
class UploaderForm(forms.Form):
file1 = forms.FileField(upload_to='user_files')
from django.forms.formsets import formset_factory
UploaderFormset = formset_factory(UploaderForm)
# long as you specify 'form-TOTAL_FORMS' and 2 other fields listed in the docs,
# the formset will auto generate form instances & populate with fields based on
# their 0 index.
formset = UploaderFormset(request.POST)
for form in formset.forms:
form.save()
最棒的是,这和验证功能完美结合,你甚至可以重新显示你的表单来显示错误信息(如果你只是通过ajax生成html,这会有点麻烦)。