Произвольное количество файловых загрузок в 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)

Другие вопросы по тегам