Django中任意数量的文件上传

时间:2011-02-24 23:50:51

标签: javascript python django html-form http-upload

允许用户使用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 个答案:

答案 0 :(得分:3)

Formsets正是您所需要的。
http://docs.djangoproject.com/en/dev/topics/forms/formsets/#formsets

您所要做的就是遵循您的javascript而不是'form-0-field'

中的formset使用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,那将会有点痛苦)