1.任意のユーザプログラムを実行する画面( EmptyView )について
チュートリアルの2章では、日本語で登録画面や検索画面などの様々な画面を作成できることを学びました。
加えて 「EmptyView」 とよばれる任意のユーザプログラムを組み込む画面を利用することで、より自由かつ高度な処理が行える画面を作ることができます。
プログラミングの知識を必要としますが、ULTRAでのシステム開発をより充実させるために、ぜひ覚えてみて下さい。
本章では例題として、「月度」ごとに入金額・出金額をテーブルに登録する画面を作成します。
ちょっと難しくなるが、覚えればシステムの幅がグンと広がるぞい
難しそうだけど…がんばって覚えようね!!
2.事前準備
2-01.集計結果を格納するモデルを作成する
まずは、 対象月の家計簿の金額合計の集計結果を格納するためのモデル(テーブル)を作成しましょう。
画面左上の入力から\モデル\トランザクション.mdを開き、次のように追記してください。
・・・
# 家計簿金額合計テーブル
|年月* | 入金額合計 | 出金額合計 |
|---------|---------|--------|
- 主キー
- 年月
- ソート順
- 年月:昇順
2-02.集計結果を検索する画面を作成する
「2-01.集計結果を格納するモデルを作成する 」で作成したモデルを検索する画面を作成します。
検索画面の作り方は、本マニュアルの「チュートリアル 2-3. 検索画面を作ってみよう」や「ULTRAの使い方 検索画面の作り方」を参考に作成してください。
ここまでは復習だね。
3.対象月の家計簿の金額合計を集計し、登録する画面を作ろう
3-01.ビュー.mdの編集
実行する任意のユーザプログラムとビュー(画面)を紐付けるために、ビュー.mdというファイルの編集をします。
\ビュー\ビュー.mdを開き、# ビューの一覧の表に次のように追記し保存して下さい。
・・・
|月別家計簿金額合計登録 |「月別家計簿金額合計登録」を実行する。|月別家計簿金額合計登録.md |||
解説:
2列目の”概要” “「月別家計簿金額合計登録」を実行する。”
「ユーザプログラム名」を実行という日本語を記述することで、
任意のプログラムを実行する画面を作るとULTRAが自動で認識しています
3-02.月別家計簿金額合計登録.mdを編集
ビューファイルを作成し、処理を記述しましょう。
月別家計簿金額合計登録.mdを作成し、次のように入力し保存してください。
# 月別家計簿金額合計登録
- タイトルは「月別家計簿金額合計登録」とする。
- 見出しは「月ごとの金額合計登録画面」とする。
- 以下の入力フォームを設置する。
- 【入力項目】
- 集計対象月
- 列サイズ:2
解説:
入力フォームはモデルに紐づかないため、任意のフォームを用意することができます
任意のプログラムを実行する画面の日本語記述に関しては、日本語マニュアルの「6. ビューの仕様記述 EmptyView」をご確認ください
3-03.月別家計簿金額合計登録画面で実行するユーザプログラムを作成
月別家計簿金額合計登録画面で実行するユーザプログラムを作成します。
\ユーザプログラム\ユーザプログラム.mdに次のように追記し、保存してください。
・・・
|月別家計簿金額合計登録 |monthly_total_registration.py |monthly_total_registration |
解説:
monthly_total_registration.pyというPythonファイル内に、 月別家計簿金額合計登録画面で選択された月の家計簿の金額合計を集計してモデルに登録するプログラムを記述します
日本語名は月別家計簿金額合計登録とします
次にPythonを記述していきます。
monthly_total_registration.py に次のように書き保存してください。
#算出した金額合計を家計簿金額合計テーブルに登録するユーザプログラム.
from ultra.models import kakei_bo_kingaku_goukei_teburu # 登録対象の「家計簿金額合計テーブル」モデルをインポート
from ultra.models import kakei_bo_teburu #「家計簿テーブル」モデルをインポート
from django.contrib import messages
from django.core.exceptions import ValidationError
def monthly_total_registration(request, form, *args, **kwargs):
#算出した金額合計を家計簿金額合計テーブルに登録する.
if request.method == "POST":
#選択された対象月を取得
taishou_tsuki = request.POST.get("shuukei_taishou_tsuki")
# 対象月が入力されていない場合はエラーメッセージを出す
if not taishou_tsuki:
messages.error(request, "対象月を選択してください。")
# 対象月が入力されている場合
else:
#選択された対象月の年・月を取得
year = taishou_tsuki.split("-")[0]
month = taishou_tsuki.split("-")[1]
# 家計簿テーブルを選択された月の月初日~月末日で絞り込む
ultra_kakei_bo_teburu = kakei_bo_teburu.objects.filter(hidzuke__year__gte = year,
hidzuke__month__gte = month,
hidzuke__year__lte = year,
hidzuke__month__lte = month
)
nyuukinGaku = 0
shukkinGaku = 0
# 取得した家計簿テーブルのレコード分ループ処理
for data in ultra_kakei_bo_teburu.all():
#入金額
nyuukinGaku += data.nyuukin_gaku
#出金額
shukkinGaku += data.shukkin_gaku
# 家計簿金額合計テーブルに、算出する金額合計の月に該当する既存データが存在する場合は削除
kakei_bo_kingaku_goukei_teburu.objects.filter(
#年月
toshitsuki = taishou_tsuki,
).delete()
#家計簿金額合計テーブルの項目に値をセットし、モデルのインスタンスを新規作成する
ultra_kakei_bo_kingaku_goukei_teburu = kakei_bo_kingaku_goukei_teburu(
#年月
toshitsuki = taishou_tsuki,
#入金額合計
nyuukin_gaku_goukei = nyuukinGaku,
#出金額合計
shukkin_gaku_goukei = shukkinGaku
)
#家計簿金額合計テーブルへの登録処理を実行
ultra_kakei_bo_kingaku_goukei_teburu.save()
messages.success(request, "集計が完了しました。")
解説:
月別家計簿金額合計登録画面で選択された月に該当する月の入金額・出金額を家計簿テーブルからまとめて取得し、合計します
入金額・出金額を合計した結果を家計簿金額合計テーブルに登録します
うぅ、、Pythonに慣れてないから難しいなぁ
3-04.月別家計簿金額合計登録画面のリンクを作成
最後に 月別家計簿金額合計登録画面に移動するためのリンクを作成します。
\サイドメニュー.mdを開き、次のように追記し保存してください。
- 【家計簿】+
...
- 月別家計簿金額合計登録
...
4.月別家計簿金額合計登録画面を動かしてみよう
すべての入力が完了したら、 月別家計簿金額合計登録画面を動かしてみましょう。
対象月を選択して、送信ボタンを押すとユーザプログラムが実行され、家計簿テーブルの金額の集計結果の登録を行います。
独自の処理を組み込んだ画面を作成できましたね。
苦労したおかげで便利な機能ができたぞい