Django中任意数量的文件上传

2 投票
1 回答
526 浏览
提问于 2025-04-16 12:29

怎样才能让用户在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,这会有点麻烦)。

撰写回答