Произвольное количество файловых загрузок в 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']
и т. д. вместо того, чтобы делать свою собственную проверку.
Благодарю.
1 ответ
Formsets именно то, что вам нужно.
http://docs.djangoproject.com/en/dev/topics/forms/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()
Самое приятное то, что это отлично связывается с проверкой, и вы даже можете повторно отображать свои формы для сообщений об ошибках (что было бы немного больно, если бы вы генерировали html только через ajax)