Django - HTTP загрузка нескольких изображений

Я посмотрел на этот вопрос:

Загрузка нескольких файлов с Django

но это, похоже, не помогло, так как у меня есть вопросы, касающиеся этого:

  1. Я не хочу иметь дело с флэш-сессиями, использующими SWF Upload и Uploadify, потому что мне нужно делать загрузки, которые могут делать только аутентифицированные пользователи.
  2. newforms для старых версий django, я использую 1.3

Используя Django, как я могу получить эту структуру формы HTML:

<form enctype="multipart/form-data" action="." method="post">
 <label for="id_image_1">Image 1</label>
 <input type="file" name="image[]" id="id_image_1" />

 <label for="id_image_2">Image 2</label>
 <input type="file" name="image[]" id="id_image_2" />
</form>

и справиться с этим, используя вид?

2 ответа

Решение

Если у вас есть фиксированное количество файловых полей, вы можете просто определить форму с достаточным количеством файловых полей или добавить программные поля программно в конструктор формы. Смотрите Django документы по загрузке файлов.

Если вам нужна какая-то динамическая функциональность (например, "добавить еще один файл"), вы можете определить набор форм, используя форму с одним полем файла. Первоначально отобразите одну форму, а когда вы хотите добавить другую, используйте небольшой JavaScript, чтобы создать новую форму и обновить форму управления набора форм. Есть несколько фрагментов, которые помогут вам в этом, хотя они могут нуждаться в настройке. Смотрите документацию Django по загрузке файлов и формам.

Другим вариантом может быть использование пользовательского виджета и поля, хотя я не проверял и не пробовал это.

На случай, если вы не в курсе, схема name="image[]" специфична для PHP и не имеет никакого особого значения в других языках, если вы не переопределите ее.

newforms это то, что текущие формы были названы до 1.0. Кроме того, если вы подтвердили свою форму, http://docs.djangoproject.com/en/dev/topics/http/file-uploads/, ваши файлы будут представлены в виде списка (вероятно, кортеж, но в любом случае последовательность) в request.FILES['image'], так что просто сделайте:

if request.method == 'POST':
    form = UploadFileForm(request.POST, request.FILES)
    if form.is_valid():
       for f in request.FILES['image']:
           handle_uploaded_file(f)

Вам придется написать handle_uploaded_file самостоятельно, URL объясняет, как

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