こんにちは!Masaです。
8回目は収支と口座残高の紐づけを完成させます!
- Django初心者で簡単なWebアプリケーション作成を考えている人
- Djangoの学び直しをしている人
- Djangoの基礎を身に付けたい人
前回のおさらいと今回やること
前回の記事では削除ボタンの実装と銀行口座の登録フォームを作成しました。
今回の記事では、収入・支出の登録した際に紐づけた口座の残高が増減するようにしたいと思います。
(光熱費の支出を登録したら、選択した口座から引き落とされるような仕様です)
頑張っていきましょう💪
収支と口座の紐づけ
収入・支出を登録したときに、選択した口座の残高が増減するように処理を記述したいと思います。
処理の工程としては
- 収入・支出の登録を行う
- その際選択した口座を抽出し、残高を計算し新し残高を登録する
- 最後に登録したデータが最新の残高となる
としたと思います。
これによって残高の推移がデータとして残ってくれるため、グラフなどを作りやすくなると思います。
収入・支出の際に口座残高を更新する
収入・支出の登録は“IndexView”のポスト時に行われます。
そのためここに追加する形で処理を記載していきます。
def post(self, request):
#収入の登録が行われた時
if 'income_register_button' in request.POST:
#収入をデータベースに追加
income = Income()
incomeform = IncomeForm(request.POST, instance=income)
incomeform.save()
#口座の最新残高をデータベースに追加
last_balance = AccountBalance.objects.filter(name=income.account).values_list('balance', flat=True).last()
latest_balance = int(last_balance) + income.amount
AccountBalance.objects.create(
name = income.account,
balance = latest_balance
)
#支出の登録が行われた時
elif 'expense_register_button' in request.POST:
#収入をデータベースに追加
expense = Expense()
expenseform = ExpenseForm(request.POST, instance=expense)
expenseform.save()
#口座の最新残高をデータベースに追加
last_balance = AccountBalance.objects.filter(name=expense.account).values_list('balance', flat=True).last()
latest_balance = int(last_balance) - expense.amount
AccountBalance.objects.create(
name = expense.account,
balance = latest_balance
)
return redirect(to='/')
主に追加した部分は9行目以下、25行目以下です(同じ処理)
やったこととしては、
- 入金・出金があった口座の最新残高を取得
- 今回の入金・出金を反映させる
- 最新のデータを保存する
という流れになります。
これで収支の登録と口座の残高が紐づきました。
次に現在の口座を表示させましょう。
口座一覧ページの作成
口座一覧ページを作成する前に、口座を作成しておきましょう。
この記事では、財布、A銀行、B銀行の3つを登録しておきます。
ビューの作成
まずはビューの作成を行いましょう。
口座一覧の処理は“views.py”の“By_AccountView”で行います。
以下を参考に記述してください。
class By_AccountView(View):
def get(self, request):
account = Account.objects.all()
#口座名のリストを作成
account_name = []
for n in account:
account_name.append(n.name)
#各口座の最新クエリをリストに追加
account_balance = []
for i in account_name:
latest_account = AccountBalance.objects.filter(name__name=i).latest('date')
account_balance.append(latest_account)
params = {
'account_balance': account_balance,
}
return render(request, 'money_diary/by_account.html', params)
処理方法としては
- 存在する口座名をリストとして取り出す。
- 口座名のリストを使用して、各口座の最新残高のクエリセットを取得する
という形になっています。
テンプレートの作成
最後にテンプレートを記述していきましょう。
“by_account.html”に以下を記載します。
{% extends 'money_diary/base.html' %}
{% block content %}
<table class="table">
<thead>
<tr>
<th scope="col">#</th>
<th scope="col">口座</th>
<th scope="col">残高</th>
</tr>
</thead>
<tbody>
{% for item in account_balance %}
<tr>
<td></td>
<td>{{ item.name.name }}</td>
<td>{{ item.balance }}</td>
</tr>
{% endfor %}
</tbody>
</table>
{% endblock %}
開発用サーバを起動して、資産詳細ページを見てみましょう。
登録した口座と残高が表形式で表示されていrたら成功です。
まとめ
本日は収支と口座を紐づけて、口座の残高が変動するような処理を完成させました。
処理方法は色々あると思いますが、シンプルなやり方の1つとして参考にしてもらえると嬉しいです。
次回は各口座の詳細ページを作成していきたいと思います。
最後まで読んでいただきありがとうございます。
自己学習に役立てていただけたら嬉しく思います
またSNSやブログでシェアしていただくことや、誤植などをコメントで指摘いただけたら幸いです。
次回の記事↓
コメント