Произвольное количество загрузок файлов в Django - PullRequest
2 голосов
/ 25 февраля 2011

Каков наилучший способ разрешить пользователю выполнять произвольное количество загрузок файлов с помощью 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? то есть было бы удобно иметь возможность доступа к form.cleaned_data['file0'], form.cleaned_data['file1'] и т. д. вместо того, чтобы выполнять свою собственную проверку.

Спасибо.

1 Ответ

3 голосов
/ 25 февраля 2011

Наборы форм - это именно то, что вам нужно.
http://docs.djangoproject.com/en/dev/topics/forms/formsets/#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)

...