djangoをdockerコンテナで利用(5) - djangoでデータベースの読み書き
ログインしないとページが見えないようなアプリケーションを構成し、データベースにある業務データを読み書きできるようにする。 1.dockerコンテナ準備onSSL 、 2.pip利用とhelloWorldとdb接続 、 3.グラフ表示練習 では環境を作り、処理を作っていくための習作みたいなものまで作れた。 その後 4.ログイン画面 もできた。 次はcrudを目指す。djangoでmariadbを読み書き削除させる。ListView,DetailView,CreateView,DeleteView,UpdateViewをそれぞれ使う。phpで作った全機能はまだ無理で部分的やけど、いくらか使えるようになったのでその作成メモ。 いろんなページ参照させてもらいました。 作者のみなさんありがとう。 【準備】crudするためのデータベース データの読み書き処理ではテストするときにデータをいくらか壊していく。 アプリケーションが無茶苦茶しても、データはいつでも元に戻せるようにしとかないとね。 自分の場合、オリジナルデータはgoogle cloudのlinuxで動かしているmariadbコンテナにあるから、そのコンテナの永続化領域をそのまま持ってきてローカルのmariadbのコンテナにアタッチして使ってる。 djangoの管理画面が起動できるようにしたときに作られるテーブルは10個。「auth_」で始まるものと「django_」で始まるものがそれ。 これを丸々mysqldumpってコマンドでバックアップ取っておき、データベース名を書き換えて「nariDB_Django」のスキーマへリストアし、「GVIS_」で始まる業務テーブルをcreateしておく。 nariDB_1stが業務テーブルだから、nariDB_Djangoに向かってa5sqlの「スキーマ間のデータ転送」を使ってデータを流し込めばいつでもデータがオリジナルと同じになる。 a5sql の作者さんありがとう。 このソフトウェアとても優秀。使ってないけど、なぜかテーブル定義書まで出せる。しかもけっこうキレイに出る。ポータブル版としても動くのでめっちゃ便利。 以前はoracleやsqlserverも扱うことがあったからnavicatを使ってたけど、今はmariadbだけなのでa5sqlで足りる。 navicat は有償で高価だけど、データの移行はめっちゃ楽。それはまた別の機会に。 オリジナルデータにはblobが入っているテーブルがあって、その中にjpegやpdfが入っている。だからコミットは1000件ずつじゃなく、100件ずつでのっそり動かす。トータル4GB程度なので、5分ぐらいで転送終わる。 サラッと書いてるけどコンテナで扱うからちょっと工夫が必要。 DBはまた別のページで書くか。 【準備】自前のcss 自前というか、以前に人にお願いして作ってもらったものを更新しながら利用。タブレットとかiphoneで見るためのおまじないのためでもある。 php版ではやってないけど、djangoではページネーションに挑戦。検索結果を表示するとき、たとえば1ページ20個レコード表示させておき、その他レコードは別ページでってことで。 ページネーションってこういう感じのやつ。 これをやるにはcss使う。ググるとbootstrapを使うのが多い。自分は普通のページネーション装飾を参考にさせてもらい、ベース色を変更してcssに追記した。 実際はまだまだ作りこんでいくので、ページネーションする箇所は別htmlで切り出して使うようにした。 【結論】実際の動き 見た目の動きはこうなる。以下作った順。 ログイン 前回作った画面でログインする。イントラのサイトでオレオレ証明書使ってsslでつながってくれる。 メニュー画面 未作成箇所あるけど、今回は真ん中のボタン「(作成中)資産一覧」ってとこ。他にも帳簿入力画面とか作っていくんだけど、crudの基本を資産登録機能で作っておいた。 一覧表示 ページネーションで最終ページ表示させたところ。 この表示ができるようになるのは苦しんだ。djangoにはページ表示のために関数版とクラス版があることに気づき、関数版で作りかけてたのをクラス版でやり直した。modelsとformsを組み合わせて自動生成してくれるのもなかなか理解しづらかった。 php版で実現していることはそのまま実現できないので、まだまだデザイン変えてかないと。 最後の3件はテストで作成したレコード。 詳細表示 今はのっぺりしてるけど、この機能を最後まで作ったらmariadbのテーブルのblob列に入ってる写真やマニュアルを閲覧するのに使うかな。 新規作成 テストデータ入れて試してるところ。作ってる途中はフォームの扱いに苦しんだな。 削除 確認メッセージは必要やね。このあたりで新規作成と更新画面の両方に確認メッセージと、完了メッセージの表示させ方考え始めた。 更新 本当はこの画面の「Seq2」は入力項目じゃなくて自動発番させたい。レコードの中から最大値を得てインクリメントしたものを設定すればたぶんできるけど、今はこのままでいいか。 更新だけじゃなく、新規作成もだけどjavascript使って確認メッセージ出るようにした。バリデーションとか入力画面を作ってくれるなら、このへんもdjangoでやってくれたらいいのに・・・。 djangoの修正対象はけっこうある 今回もある程度できた後で、gitの差分を見ながら作った箇所書いてるのな。 ...