【DJango】画像アップロードフォームを実装する【Python】

スポンサーリンク





画像アップロードフォームを実装する

Pythonを勉強していくうちに機械学習を使ってちょっとやってみたいことが出来たのでWebサイトを作るためにDjangoも勉強することに。

やりたいこと
  1. Googleの画像検索みたいに画像をアップロードすると一致する画像と名前を返す。
  2. 画像アップロード時に対象の主なジャンル(フィギュア/ねんどろいど等)を選択可能にする。
  3. 一致した名前がヤフオク、メルカリで何円ぐらいで取引されているか検索して結果を表示する。
目的

自分が勤めているのはリサイクルショップなわけですが、買取の商品などで箱などの付属品がないと正直なところ何かわからないです。タイミングよく担当者か分かる人間がいるといいのですが、いないと「なんじゃこりゃ」になるわけです。そのままの状態で適切な値段がつけられないと、お客様は不満に思って、次につながらないという残念な事になってしまいます。そういう時の状況をなんとかしたくて作ろうと思ったわけです。
それよりどっちかというと別部門の人から「Googleの画像検索みたいにスマホで商品写真を撮ってそれが何かわかるようなのって作れない?」という事を聞かれたのがきっかけでもあります。その部門はネット部門だったので販売する時に何かわからないと値付けも満足に出来なくて余計に大変です。(この辺は部門間の連携をうまくすれば良いかもしれないけど、いろいろあるんですよ)

という事で勉強がてら作ってみることにします。
参考にしたのはこの書籍

あまりDjangoの書籍って売ってませんね。需要が低いのかな?

まずはこの書籍を参考にDjangoでテキスト入力と画像アップロードが出来るWebサイトを作ります。この書籍には画像アップロードの事が書かれていなくて色々と調べて作成しました。

出来上がりイメージ

とりあえず今回の出来上がりはこんな感じです。

アップロード前 アップロード後

入力項目として、「名前」「メールアドレス」「年齢」「血液型」「画像」をテキストボックス、コンボボックス、ファイルアップロードを使います。
これらを入力して「Click」ボタンをクリックしてファイルをアップロードして入力した内容を表示します。画像はサムネイル作成して表示します。

ソース
それではソースコードです。
プロジェクト構成
プロジェクト構成は左図の通り
プロジェクト名:django_sample
アプリ名:hello
で作成します。

django_sample/settings.py

ここでは作成するアプリ「hello」の追加とアップロードしたイメージの保存先を設定します。
まず、作成するアプリの追加

次にイメージの保存先を定義します。
フォルダ「django_sample」の直下に「media」フォルダを作成します。それをここで定義します。
一緒にTIME_ZONEも変更します。既存で設定されているTIME_ZONEは削除します。

django_sample/urls.py

ここではアプリのパスとアプリのurls.pyをincludeします。
同時にイメージ保存先の定義をします。
最後の2行である「if settings.DEBUG:~」という部分がないとイメージの保存が出来ないそうです。

hello/forms.py
ここではWebサイトの表示内容を定義します。
「CHOICE」は血液型のコンボボックスの選択内容、
「HelloForm」でWebサイトで実際に表示される項目の定義をします。
「name」「mail」は「forms.CharField」で文字列の入力にします。
「age」は「forms.IntegerField」で数値の入力にします。
「blood」は「forms.ChoiceField」でコンボボックスの入力にして選択内容に「CHOICE」を設定します。
「photo」は「forms.ImageField」で画像入力にします。「required=False」で必須項目でなくします。(required)を定義しないと必須項目になります。
hello/models.py
ここでは画像ファイルを扱う設定をします。
「image」はアップロードされた画像ファイルを扱うときに呼び出します。「upload_to」は実際にファイルがコピーされるフォルダです。この場合「settings.py」で定義した「MEDIA_URL」の直下に「hello」を作成しその下に画像ファイルがコピーされます。
「thumbnail」はサムネイル表示する時の設定です。「processors」で画像のサイズ、「format」で形式、「options」で画像の質を設定します。
hello/views.py
ここでは画面表示の内容をPOSTとGETでそれぞれ設定しています。
「params」で設定している値を「index.html」に渡して内容を表示させます。
hello/urls.py

今度はアプリのurls.pyを修正します。同じファイル名でプロジェクトとアプリにあるとか正直、混乱のもとです。同じ役割なので同じファイル名でも仕方ないですが(´・ω・`)

hello/index.html
ここは実際に表示されるHTMLです。
基本的に通常のHTMLの内容に「{{ ~ }}」や「{% ~ %}」でDjangoの内容を渡します。
「load static」は「hello/static」フォルダにあるファイルを読み込みます。基本的にstaticフォルダはCSSなどのファイルを作成しておきます。今回は作成していないです。

「views.py」で設定した「params」の「title」の値を「<title>」タグとの内容として表示します。

「views.py」で設定した「params」の「message」の値を表示します。「safe」でエスペープします。

これはクロスサイトリクエストフォージ対策です。Djangoではあらかじめ用意されているのでこの1文で完了です。

「views.py」で設定した「params」の「form」の値を表示します。「.as_table」でテーブル形式で表示させます。

「views.py」で設定した「params」の「photos」の画像を表示します。

スポンサーリンク
%d人のブロガーが「いいね」をつけました。