前回まで でデータベースにある業務データを読み書きできるようになった。
ここまで来るとソースも大きくなりがちで、viewsとmodelsがデカくなってくる。 自分の好みやけど、できるだけ1つの定義とか機能は100行ぐらいでおさまってほしい。 modelはデータベースの列の数に依存やから、まぁしゃあないか。
できれば分割できないかって思ってたら、あります、できます、その作成メモ。
分割方法をまとめておられる方がおられた。 作者さんありがとう。
formsのことは書いてなかったけど、だいたい同じ要領でできる。
分割対象はこのへん
⭐️の箇所を更新。まずはviewsを分割し、urls.pyを書き換えていく。
次にmodelsを分割して__init__.pyにmodel定義の一覧みたいなのを追記。
けっこうあっさりできてしまう。
今は小さいけど、formsも割る準備やっちゃう。
|
|
viewsの分割
さっきのツリーにあるviewsを分割。
| |--views.py ⭐️1
同じ階層にviewsフォルダ作成して、views.pyをviewsフォルダの中に移動し、コピーして名前変更してから必要な箇所を残すよう編集。
さらに__init__.pyを空ファイルで置いとく。
|
|
分割の方針は機能単位にした。
分割前の最初のviews.pyはこんな内容。
| views.py | 内容 |
|---|---|
| インポート | render/django.views.genericとかmodels/formsとか取り込み |
| def定義 | “return render"のみのdef定義 |
| クラス定義 | crudのclass定義 |
分割後はのviewsフォルダに置いたpyファイルは、それぞれこんな内容。
| gvis_base_views.py | 内容 |
|---|---|
| インポート | renderとか取り込み |
| def定義 | “return render"のみのdef定義 |
| gvis_zaiko.py | 内容 |
|---|---|
| インポート | django.views.genericとかmodels/formsとか取り込み |
| クラス定義 | crudのclass定義 |
もちろんインポート内容は必要なものに絞った。 ちょっとスッキリ。
models/formsのインポート記述は少し変えないといけなかった。
-
変更前 from .forms import GvisZaikoForm
-
変更後 from ..forms import GvisZaikoForm
フォルダに入れたからと思うけど、vscodeでカンマ(.)を入力したとき候補が出てこず。
カンマを2個入れたら(..)viewsとかformsが選べるようになった。 viewsのフォルダから見て1つ上の階層ってことで(..)を指定するみたい。 これでいいのか? まぁ続けてやってみよう。
分割してすぐ「どや、行けるか?」って気持ちが先に行ってしまい、__init__.pyに定義書くの忘れて、空のままにしとくとなぜかmigrateできてしまい動いた。
viewsだけ定義なしでも動くんかなぁ。それともdjangoが忖度してくれてんのかなぁ。
modelsとformsは必ず書かないとエラーになってまう。
今はわからんけど、後で気づいたら直そう。
今は__init__.pyの中はこんな感じ。いつかエラーが発生してコメント化を外せる理由がわかる日まで。
|
|
urlsの変更
インポートの書き換え
この行カットする。さっきviews.pyは分割しちゃったし。
from . import views
代わりにこの行を入れる。分割した新しいview名をそれぞれ指定する。
さっき「..forms」って書いたのは、1つ上の階層を指定っぽいので、urls.pyから見たviewは同一階層にある。だからここの「.views」は「..views」とは書かなくても使えてるのかも。
|
|
データ登録・削除・表示がちゃんとできたから、これでよしとしとこ。
urlpatternsの書き換え
4行あるうち、最初2行のloginとlogoutはそのまま。後ろ2行を更新。
さっきgvis_base_views/gvis_zaiko_viewsをインポートするようにしたので、pathの2個目の引数の「views.」の箇所を書き換えた。
【変更前】
|
|
【変更後】
|
|
参考にさせてもらったページには、アプリケーション名も指定ってあったけど、書き忘れてやってみたら指定しなくても行けた。
modelsの分割
自分が扱おうとしている業務データベースはinspectして自動生成させた。 crudの基本部分を作るため、数字と文字を数個選んで部分的に読み書きさせるようにしてある。
今は部分的に抜き出して数十行のmodels.pyがあって、inspectした結果から抜き出したものを書き足すとけっこうな増え方してくれた。
これからまだ追記するし、できればテーブル単位でmodelは書きたい。
変更前の状態。
| |--models.py ⭐️2
変更後の状態。
|
|
変更後は、__init__.pyに「(アプリケーション名).models.(テーブルのクラス名)」を書く。
from gvisWebApp.models.GvisZaiko import GvisZaiko
formsの分割
参考にさせてもらったページには書いてなかったけど、modelsの分割と同じ要領でやってみたらできた。
変更前の状態。
| |--forms.py ⭐️4
変更後の状態。
|
|
modelsのときと同じやり方で、__init__.pyに追記する。
from gvisWebApp.forms.gvis_zaiko_forms import GvisZaikoForm
その次
models/formsにはmariaDBの中の項目をまだ100分の1も書いてないから今は小さいけど、デカくなってくんやろなぁ。
crudの基本部分あるから、あとは日付やblob列に入れるjpeg/pdf登録機能を作ってく。