複数ファイルのアップロード、バージョンN

昔から、インターネットが若くて遅いとき、最も一般的なブラウザはIEではなく、Mosaicでした。彼らはインターネットに行かず、ダイヤルしました...私はよく質問に悩まされました-ファイルダイアログで1つのファイルしか選択できないのはなぜですか? フォームに3つのファイルフィールドがある場合、それぞれのフィールドを確認する必要があるのはなぜですか? それは本当に不可能ですか?
時間が経つにつれて、javascript、CGIが登場しましたが、ファイルフィールドも利己的でした。 その後、フラッシュが出現し、html5、状況が変わり始めましたが、...ファイルフィールドには同じ本質があります-ファイルではなく、ファイルs ! 多くの回避策がありますが...

だから、同僚、あなたはそれを推測した、私はあなたと別の「自転車」を共有したいと思います。 そして、彼が誰かの生活を少し楽にしてくれるなら、私はとても幸せです。 しかし、先に進む前に、 クロスブラウザマルチファイルプレーヤーであるPluploadのようなすばらしいツールの作成者に感謝せざるを得ません。

asv_files


それで、知り合いになると、 asv_filesはフォーム(以下、モデル)のカスタムフィールドであり、 N個のファイルを自分で読み込むことができます。 フィールドだけでなく、無効なフォームなどのイベントを既にダウンロードしたファイルを存続させ、修復のために送信するためのバインディングも補充されます。 また、ContentTypesを使用して、これらのファイルをモデルの任意のインスタンスに簡単に添付できるようにするメソッド。

pluploadの作成者はブラウザ間の互換性を約束しているので、信じない理由はありません。 少なくともIE、Opere、FireFox、Chromeでは、フィールドは正常に動作します。

イデオロギーと基本的な教義


だから、主な仮定は私が導かれたということです:

設置


インストールの複雑さは驚くべきものです。
$ pip install asv_files 

同時に、asv_filesはいくつかの依存関係をもたらします。そのうちの1つ( asv_media )にはjQueryとpluploadの両方が含まれ、静的ファイルを介して送信できます。

次に、settings.pyでasv_files、asv_media、django.contrib.sitesアプリケーションを接続する必要があります。
 INSTALLED_APPS = ( ..... 'django.contrib.sites', ..... 'asv_media', 'asv_files', ..... ) 

manage.pyを使用して必要なモデルを作成します。
 $ python manage.py syncdb 

そして、目に見えないフロントリクエストハンドラーのurls.py ファイターを招待します。
 from django.conf.urls import patterns, include, url urlpatterns = patterns('', ..... url('AnY_YoUr_LiKe_PaTh/', include('asv_files.urls', namespace='asv_files')), ..... 

RPCレスポンダーを任意のURLに接続できます。上記の名前空間を変更しないことが重要です。

使い方


Djangoでのフォームの操作は、クラシックビューを使用するか、クラスベースに切り替えるかにほとんど依存しません。 一番下の行は次のとおりです。

フォームの説明:
 from django import forms from asv_files.fields import CTfilesFormField class TestForm(forms.Form): #..... files = CTfilesFormField() #..... 

ビューで使用します:
 def TestView(request, ...): obj = Articles.objects.get(.........) if request.method == 'POST': form = TestForm(request.POST) if form.is_valid(): # ..... files = form.cleaned_data['files'] for i in files.get_files(): print('file {frn} saved as {fn} ({fp}) and have ID:{id}'.format( frn = i.get_realname(), fn = i.get_filename(), fp = i.get_filepath(), id = i.fileid, )) i.attach_to(obj) # attach to OBJ through ContentTypes #i.delete() # remove file from database and storage files.delete() # remove session and her files from database and storage else: form = TestForm() return render(request, 'template.html', { 'form': form, } 

テンプレート内のメディアファイルを正しく接続することを忘れないでください。
 {% extends "base.html" %} {% block add_to_head %} {{form.media}} {% endblock %} {% block wp %} <hr> <form method="POST" action="{% url demo:form1 %}">{% csrf_token %} <table>{{ form.as_table }}</table> <input type="submit"> <input type="reset"> </form> {% endblock %} 

add_to_headブロックは基本テンプレートに自然に存在するはずです。

manage.pyによる管理


manage.pyでは、uploadsコマンドを使用できます。このコマンドを使用すると、ダウンロードセッションと一時ファイル(つまり、アップロードされたが、フォームは送信されなかった、または送信されたが、プログラマーはフォーム送信ハンドラーでファイルを削除するのを忘れたファイル)を管理できます:
 $ ./manage.py uploads --help Usage: ./manage.py uploads [options] <sess_ID or filename> Managament for upload files and sessions Options: --sessions list unclosed upload sessions and it's files, if exist --realname display real (user's) file name near file name --no-files, --nofiles do not display information about files --older=XX use only sessions older than XX hours --only-uuids, --onlyuuids show only session's UUIDs --remove remove upload session and her files 

そのため、2つの主なコマンドがあります。
 $ ./manage.py uploads --sessions 
そして
 $ ./manage.py uploads --remove sessID-1 sessID-2 ... sessID-N 

1つ目は、不完全なダウンロードセッション、そのファイル、およびその他の関連情報を示しています。
2番目のものは、リストされたセッションと対応するファイルをDBから削除します。

uploads --sessionsコマンドのキー:


そして結論として、私は...言いたい...


asv_filesのソースはこちらです。
いつものように急いで書かれたドキュメントが近くにあります。
小さなデモ(変更にはCBVが使用されます) は、大陸の反対側にある2つのフィールドの近くの作業を示しています。
そして、素晴らしいCBVのドキュメントは、あなたが思うよりも近いです...

批判、バグ修正、提案を喜んで受け入れます。
ご清聴ありがとうございました。

UPD: Operaは修正され、Safariはロードされますが、html4を介してファイルごとに追加されます

サポートされているブラウザー: InternetExplorer 7 +、Firefox、Chrome、Opera、Safari

Source: https://habr.com/ru/post/J144052/


All Articles