【问题标题】:Arbitrary Number of File Uploads in DjangoDjango中任意数量的文件上传
【发布时间】:2011-07-03 23:28:15
【问题描述】:

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

谢谢。

【问题讨论】:

    标签: javascript python django forms http-upload


    【解决方案1】:

    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,这会有点痛苦)

    【讨论】:

    • 老兄。甜的。这看起来正是我需要的。我听说过 Django Formsets,但还没有使用它们。谢谢!
    • 嘿,没问题!是的,它非常有用
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-16
    • 2011-12-09
    • 2018-02-18
    • 2014-07-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多