允许用户使用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']
等,而不必进行自己的验证是很方便的。
感谢。
答案 0 :(得分:3)
Formsets正是您所需要的。
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,那将会有点痛苦)