[python] DJangoで遊ぼう ~FileFieldを使う

ひたすらDjangoが続く…

前回でWebページが出来たので、これにいろんな機能を追加しつつWebページの作り方を覚えていこうと思います。

とりあえず、FileFieldを追加して ファイル(今回は画像)をアップして、Viewで表示する ように
前回までのものを修正していきます。
今回はFileFieldを使用しましたが、画像専用のImageFieldもあるので 本当に画像しか使わない場合はこちらを使用するほうが良さそうです。

まず、setting.pyに ファイルのアップロード先設定を追加します。

次にmodels.py にFileFieldを追加します。

こうすると、 MEDIA_URL 下の upload_to フォルダ下にファイルを保存してくれます。
↑の場合、 documents/2015/10/20 下になります。

その次はforms.pyを編集

labelを指定しない場合は、フォームの名前は変数名とおなじものになります。

編集用のViewのTaskFormの引数に request.FILES を追加します。
最後にTemplateを変更します。
変更箇所は1カ所。

formの中に enctype を追加します。
コレがないと、validated_error が出てしまい失敗してしまいます。

これでアップロード側はOKです。
続いてlistがわに画像を追加する部分。
せっかくなので、lightboxを使用して画像を表示するようにしてみました。

まず、views.pyのcontextに、mediaフォルダを追加します。

Lightboxの公式で .js ファイルをダウンロードして、staticフォルダに配置します。

base.htmlの頭の部分に

これ
bodyの下あたりに

を追加します。

task_list.html のテンプレートの部分に、画像を表示する部分を追加します。
view.pyで指定したcontext(media_url)+task.t_file をImgパスとして使用しています。
LightBoxを使用するには、 rel=”lightbox_[グループ名]” を、aタグの中に追加すればOKです。
グループ名は、lightboxの次へ・まえへボタンで行き来できる画像のグループを指定するためのもので、何でもOKです。

これだけだと、mediaフォルダまでパスが通っていないのでurls.py に メディアフォルダを追加します。

lightbox_img

ここまでできたら、一覧のページを確認。
アップロードした画像をクリックすると、こんな感じで表示されるようになりました。

FileFieldの使い方を調べていたら、request.FILES で受け取ったファイルを open(<file>,’wb’)を使用して書き込む
ようなやり方もちょくちょく見られたのですが、それより今回やったようなupload_to機能があるなら
こちらを使う方が良さそうです(わりと最近のDJangoで追加された機能なのか?)

やるまえはforms.pyまわりよーわからんと思ってましたが
分かってみると拡張したりするのも、実際に使ってみるのも簡単で良いですね。
API作ってPythonの単独ツール作るより遙かに簡単…

最近Djangoばっかりだし、たまにはMayaな事もネタにしたいですのう

コメントを残す

メールアドレスが公開されることはありません。


*