時間が経つにつれて、javascript、CGIが登場しましたが、ファイルフィールドも利己的でした。 その後、フラッシュが出現し、html5、状況が変わり始めましたが、...ファイルフィールドには同じ本質があります-ファイルではなく、ファイルs ! 多くの回避策がありますが...
だから、同僚、あなたはそれを推測した、私はあなたと別の「自転車」を共有したいと思います。 そして、彼が誰かの生活を少し楽にしてくれるなら、私はとても幸せです。 しかし、先に進む前に、 クロスブラウザマルチファイルプレーヤーであるPluploadのようなすばらしいツールの作成者に感謝せざるを得ません。
asv_files
それで、知り合いになると、 asv_filesはフォーム(以下、モデル)のカスタムフィールドであり、 N個のファイルを自分で読み込むことができます。 フィールドだけでなく、無効なフォームなどのイベントを既にダウンロードしたファイルを存続させ
pluploadの作成者はブラウザ間の互換性を約束しているので、信じない理由はありません。 少なくともIE、Opere、FireFox、Chromeでは、フィールドは正常に動作します。
イデオロギーと基本的な教義
だから、主な仮定は私が導かれたということです:
- 美人じゃない。 私はあなたのデザインに入るのにあまり良いテレパスではありません。 テンプレートはシンプルであり、修正のためにアクセスできます。主なことは、クラス名を失うことではありません。 通常、テキストメッセージは、settings.pyを介して、またはフォームのファイルフィールドごとに異なるメッセージが必要な場合はクラス継承を介して再定義されます。
- 1つのWebページにはN個のフォームがあり、各フォームにはM個のファイルフィールドがあります。 フォームは無限の回数送信を試みることができます。
- html5を使用して作業できる場合は、使用可能です。使用できない場合は、フラッシュ、シルバーライト、利己的なhtml4を自由に使用できます。
- アンロードされたファイルがある場合、フォームを送信できません(無効)。
- クラスベースのビューを使用して、柔軟性と継承機能を高めています。
- キリル文字のファイル名、スペースと特殊文字を含むファイル名は悪であるため、音訳して正規化する必要があります。 ただし、ユーザー側のファイル名は重要な情報であることが多いため、失われることはありませんが、当面は保存します。
- ファイルはローカルだけでなく保存できるため、Djangoで利用可能なファイルストーリーメカニズムを使用します。 dropbox、google-drive、Yandex-driveとの統合は積極的に見られます。
- django.staticfilesは、開発と展開の両方で肯定的です。
- manage.pyにはファイルを管理するためのコマンドが含まれている必要があります。
設置
インストールの複雑さは驚くべきものです。
$ 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
そして
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コマンドのキー:
- --realname-保存されたファイルの名前だけでなく、ユーザーがそれをロードしようとしたファイルの名前も表示します
- --no-files-ファイル情報を表示しません。 セッションIDのみ
- --only-uuids -1つの長い行にスペースで区切られたセッションIDのみを出力します。 その後の除去に使用すると便利です。
- --older = XX - XX時間を超える年齢(作成日)のセッションのみを表示します。 クロックは、整数、アヒル、および10進数(= 0.25-15分の1時間)として示すことができます
そして結論として、私は...言いたい...
asv_filesのソースはこちらです。
いつものように急いで書かれたドキュメントが近くにあります。
小さなデモ(変更にはCBVが使用されます) は、大陸の反対側にある2つのフィールドの近くの作業を示しています。
そして、素晴らしいCBVのドキュメントは、あなたが思うよりも近いです...
批判、バグ修正、提案を喜んで受け入れます。
ご清聴ありがとうございました。
UPD: Operaは修正され、Safariはロードされますが、html4を介してファイルごとに追加されます
サポートされているブラウザー: InternetExplorer 7 +、Firefox、Chrome、Opera、Safari