Интеграция plupload в django

Как быть, если необходимо загрузить на сервер несколько файлов? В django есть fieldset, но они настолько рогаты, что пользоваться ими невозможно. Поэтому мы пойдем другим путем.

Для аплоада файлов решил воспользоваться plupload. Посмотрим что же это такое.

The developers of TinyMCE brings you Plupload, a highly usable upload handler for your Content Management Systems or similar. Plupload is currently separated into a Core API and a jQuery upload queue widget this enables you to either use it out of the box or write your own custom implementation.

Звучит неплохо, поэтому приступаем к хакингу. Для начала подготовим простую платформу для удобного аплоада через внутренний механизм django.

*PLACEHOLDERS_PRE_2*

Как видно я не использую ManyToManyField для модели Article, это было бы излишне. Вместо этого используем связь OneToMany.

Создадим форму для аплоада.

*PLACEHOLDERS_PRE_3*

Я исключил из формы поле article, оно не понадобится на этапе сохранения формы, зададим его чуть позже, когда будет инстанс класса Photo.

Определяем нашу модель в админ-части.

*PLACEHOLDERS_PRE_4*

В админ-части джанго очень сложно что-то кастомизировать, и постараться лучше этого вообще не делать, но раз нам надо добавить поле, которое не привязано к модели Article, плюс написать кучу дополнительного кода для инициализации виджета аплоадера, то наверно лучшим способом будет переопределить шаблон формы, унаследовать его от «admin/change_form.html», переопределить необходимые блоки, не забыть при этого сделать вызов {{ block.super }}.

И использовать документацию Plupload для конечной интеграции. Поехали.

*PLACEHOLDERS_PRE_5*

Теперь осталось реализовать только метод загрузки.

*PLACEHOLDERS_PRE_6*

Что мне не удалось это заставить работать через html5, обидно, но и флеш неплохо справляется.

Рабочие исходники лежат на гитхабе.

Напоследок скриншот с внедренным plupload.

Все про українське ІТ в телеграмі — підписуйтеся на канал DOU

👍ПодобаєтьсяСподобалось0
До обраногоВ обраному0
LinkedIn



10 коментарів

Підписатись на коментаріВідписатись від коментарів Коментарі можуть залишати тільки користувачі з підтвердженими акаунтами.

Щиро Вам дякую за даний how-to

А редактирование как работает?

Если используется админка, то почему не использовать admin.TabularInline? Или вся проблема в fieldset-ах? Если да, то не могли бы указать на недостатки при его использовании...

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

Ограничение количества полей не должно быть проблемой, т.к. можно указать какие поля отображать. А вот выбирать каждый файл по отдельности — это да неудобно. Но мне кажется можно доработать скрипт с функцией выбора нескольких файлов и в соответсвии с выбраным количеством расширить количество записей в TabularInline.

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

Прошу прощения, я неправильно выразился, TabularInline ограничивает количество рядов отображаемых за раз.

Прошу прощения, я неправильно выразился, TabularInline ограничивает количество рядов отображаемых за раз.

Вы про количество отображаемых форм?

Так есть параметр extra, в котором указываете сколько форм отображать и можете создать столько рядов, сколько вам нужно.

Больше похоже на то, как использовать plupload, а не как улучшить ним админку. Что если кроме файла нужно заполнять дополнительные поля для фотографии? И как редактировать/удалять фотографии?

Так есть параметр extra, в котором указываете сколько форм отображать и можете создать столько рядов, сколько вам нужно.

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

Больше похоже на то, как использовать plupload, а не как улучшить ним админку.

тема поста не как улучшить админку, а как встроить plupload, скажем это отправная точка, маленький how-to.

Что если кроме файла нужно заполнять дополнительные поля для фотографии? И как редактировать/удалять фотографии?

я не ставил перед собой цели описать как реализовать редактирование удаление. простите. :-)

Підписатись на коментарі