2011-02-24 55 views
2

允許用戶使用Django進行任意數量的文件上傳的最佳方式是什麼?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']等而非必須進行我自己的驗證將是方便的。

謝謝。

回答

3

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

所有你所要做的就是遵循該formset使用'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)

+0

夥計。甜。這看起來正是我需要的。我聽說過Django Formsets,但還沒有使用它們。謝謝! – 2011-02-25 00:07:48

+0

嘿,沒問題!是的,這非常有用 – 2011-02-25 00:10:56