他のアプリにユーザーフレンドリーな複数/大量ファイルアップロード機能を提供できるDjangoアプリ
質問
正直に言うと、これは先週Django-Usersメーリングリストで尋ねた質問です。まだ返事がなかったので、ここでもっと注目されることを期待してStack Overflowに再投稿しています。
ユーザーフレンドリーな操作を簡単に行えるアプリを作成したいのですが、 独自のアプリでの複数/大容量ファイルのアップロード。ユーザーフレンドリーな私は ユーザーが複数選択できるGmail、Flickrなどのアップロードを意味します。 ファイルの参照ダイアログでファイルを一度に。その後、ファイルがアップロードされます 順次または並行して、選択したファイルの素晴らしい概要 ページの横にプログレスバーが表示されます。 「キャンセル」 アップロードボタンも可能なオプションです。
そのすてきな部分は通常、Flashオブジェクトを使用することで解決されます。コンプリート 次のようなクライアント側のソリューションがあります:SWFUpload http://swfupload.org/ 、FancyUpload http://digitarald.de/project/fancyupload/ 、YUI 2アップローダー http://developer.yahoo.com/yui/uploader/ およびおそらく さらに多く。
もちろん、トリックはこれらのソリューションをあなたの プロジェクト。特にDjangoのようなフレームワークでは、必要に応じて2倍にします。 再利用可能です。
だから、私はいくつかのアイデアを持っていますが、私はDjangoの専門家でもなければ、 Flashベースのアップロードソリューション。私の考えをここで共有します より知識が豊富で経験豊富な人々からフィードバックを得る。 (または、「私もこれが欲しい!」と答えるだけです:))
あなたは私がいくつかの仮定をしていることに気付くでしょう:これは (初期)制御下にあるアプリケーションのスコープ。これらの仮定 もちろん議論の余地があります:
大丈夫、私の考えはこれまでのところ:
-
複数のファイルを一括アップロードしたい場合は、 各ファイルを含むモデル。つまり、モデルには1つが含まれます FileFieldまたは1つのImageField。 複数の(ただし有限の)FileFields /を持つモデル ImageFieldsは、簡単に大量にアップロードする必要はありません。 100個のFileFieldsを含むモデルでは、何か間違ったことをしています:) 想定される大量アップロードの例:
- ファイルフィールドを持つ1つのモデル「パンフレット」のみを持つアプリ、 タイトルフィールド(ファイル名から動的に作成)およびdate_added フィールド。
- モデル「Gallery」と「Photo」を備えたフォトギャラリーアプリ。あなたが選ぶ 写真を追加し、写真と新しい写真オブジェクトをアップロードするギャラリー 作成され、選択されたギャラリーに外部キーが設定されます。
-
あなたのためにアプリを設定または拡張できると便利です お気に入りのFlashアップロードソリューション。上記の3つのうちの1つを選択できます デフォルトですが、アプリを実装して、人々が簡単に追加できるようにします 追加の実装(Djangoのようなものは複数の データベース)。特定のクライアント側ソリューションに依存しないようにします。
-
最初に1つを選択する必要がある場合は、 最小のフットプリント? (クライアント側のものの最小ダウンロード)
-
Flashベースのソリューションは非同期に(および順次または 並行して)ファイルをURLにPOSTします。そのURLはローカルにすることをお勧めします 私たちの一般的なアプリに(したがって、あなたが私たちを使用するすべてのアプリで同じです アプリで)。このURLは、汎用アプリが提供するビューに移動します。
-
ビューは次のことを行います。新しいモデルインスタンスを作成し、 ファイル、必要に応じて追加を行い、インスタンスを保存します。
-
DO EXTRA STUFFは、アプリを使用するアプリが実行したいコードです。 モデルに追加されたコードがあれば、追加のコードを提供する必要はありません。 FileField / ImageFieldは、標準のビューコードがジョブを実行します。 しかし、ほとんどのアプリは、記入するなど、余分なことをしたいと思うでしょう その他のフィールド:title、date_added、foreignkeys、manytomany、...
-
yがありません
解決
このための簡単なアプリを約1か月前にリリースしました: django-uploadify 。
基本的には非常に気の利いた Uploadify (jQueryが必要)のラッパーとして機能するDjangoテンプレートタグです。これをテンプレートに追加するのと同じくらい簡単です...
{% load uploadify_tags }{% multi_file_upload ‘/upload/complete/url/’ %}
タグは、クライアント側とサーバー側(Djangoシグナル)の両方でイベント(ファイルごとに1つ)を起動し、着信ファイルが受信されたことを示します。
たとえば、ユーザーがアップロードしたすべてのファイルを処理するモデル「Media」があると仮定します...
def upload_received_handler(sender, data, **kwargs):
if file:
new_media = Media.objects.create(
file = data,
new_upload = True,
)
new_media.save()
upload_recieved.connect(upload_received_handler, dispatch_uid=‘whatever.upload_received’)
wiki で、設定方法と信号の作成方法を確認してください。ハンドラー(クライアント/サーバー)。
上記の概念的な実装について、いくつか考慮すべき点があります:
- アプリに「ファイルモデル」を自動的に作成させると、インスタンスは、おそらく、人々が既に使用している独自のモデルを持っているほど堅牢ではありません
- 任意のタイプのセキュリティまたは認証を実装する場合は、オープンシステムが必要であり、「自動作成」タイプはあまり必要ありません
- シグナル/イベントはこれを処理する方法であり、あなたが言及した「DO OTHER STUFF」部分も処理する方法だと本当に思います。
- 私の結論は、Djangoがフォームウィジェットを実装するという意味で、マルチアップロードがフォームウィジェットになることは決してないということでした。ほとんどの場合、1つのファイルは1つのモデルインスタンス(いくつかの例外を除く)で表されます。つまり、1つのウィジェットがN個のモデルインスタンスを表すことができる状況になります。ただし、Djangoは、ウィジェットが1つのインスタンスの1つのフィールドに対して1つの値を表すように設定されています。ウィジェットとしてそれを使用することは、ほとんどのユースケースに適合しません(そのため、テンプレートタグルートを使用した理由です)。