2

允许用户使用 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']等会很方便,而不必自己进行验证。

谢谢。

4

1 回答 1

3

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

您所要做的就是遵循表单'form-0-field'集在您的 javascript 中使用的字段命名格式,而不是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,这将有点痛苦)

于 2011-02-24T23:58:52.473 回答