Djangoで毎月の出費を分析できる家計簿アプリをつくろう!【基礎編】
見出し画像

Djangoで毎月の出費を分析できる家計簿アプリをつくろう!【基礎編】

【更新内容】
・Djangoバージョン(2.1.7)でも動作確認済み(2019/3/17)
・応用編をリリースしました。(2018/1/24)
・基礎編と応用編をまとめたマガジンを作成しました。(2018/1/24)
・簡単ではありますがデモ動画をUPしました。(2018/1/6)
       (目次の前に追加)

本記事は、Django初心者向けにWEBアプリケーション開発スキルを具体的な事例を交えて習得できる内容となっています。

Djangoの書籍はまだ少なく、初心者が読んでも理解が難しい部分があったりして自分自身も最初は苦労しました。

少しでも入門者の方が挫折しにくいようなチュートリアルがあったらいいなという思いから本記事を作成しました。

Djangoを学ぶ以上、PythonやHTMLといった幅広い基礎知識が必要になってきますが、デザインに関わるような部分(HTML)を除いて、PythonやDjangoに関する部分は1つ1つ説明文を加え、処理フロー等を図解で説明してイメージしやすいようにしています。

後半には普通のチュートリアルではあまりでてこないような、ちょっとした応用事例も加えてあります。

応用事例については、最初は少し難しく感じる部分もあると思いますが、1つ1つ読み進めていけば理解できると思います。

※本記事について不明な部分は、質問も受け付けますので安心して取り組んでいただければと思います。

さて、本記事を最後までやり遂げると、以下のような家計簿アプリを作成できるようになります。

【基礎編:一覧表示画面】
※その他に新規データ登録、変更、削除画面も実装します。

画像1

【おまけ:カテゴリ毎の合計金額割合の分析】
※登録したデータを元に円グラフを自動生成
※総出費額に対して各カテゴリが占める割合を自動計算

画像2






※以下の応用編も含めた上記マガジンがお得になっています。

応用編:毎月の合計額推移の分析】
※登録したデータをもとに折れ線グラフを自動生成
※月単位でカテゴリ毎の合計出費額の推移を自動計算してグラフ化します。

画像3

簡単ですが家計簿アプリのデモ動画を作りました。

※動画のみで説明文はありませんのでご了承ください。


以下のDjangoWEB API開発コースもおすすめです。


【本技術ノートの目次】

・この技術チュートリアルを通してできるようになること
・対象者
・サポート体制
・開発環境
・Anacondaの導入
・仮想環境の作成
・モジュールのインポート
・プロジェクトの作成
・開発サーバ起動
・言語設定
・データベース設定
・アプリケーションの作成
・Djangoアプリケーションの全体構成
・Djangoの設計思想
・モデルの作成
・テーブルのリレーション
・マイグレーション
・管理者権限ユーザの作成
・adminサイトの設定
・テストデータの登録
・CRUDとは?
・READ(一覧表示ページ)画面の開発
・CREATE(新規データ登録ページ)画面の開発
・UPDATE(更新ページ)画面の開発
・DELETE(削除ページ)画面の開発
・応用編(カテゴリ毎の合計金額割合の分析)

この技術チュートリアルを通してできるようになること

①Django開発環境の構築ができるようになる。
②Djangoアプリケーション開発の基礎的な機能(新規作成、参照、変更、削除)の実装ができるようになる。
③基礎から一歩進んで、ちょっとした応用事例を学べる。
④家計簿アプリを自作して、毎月の出費の傾向分析を自動でできるようになる。

対象者


このチュートリアルのおすすめ対象者は、こんな人です。

1. Pythonの基礎構文がわかる程度の人。
(変数、関数、クラス、for,if文等の基礎構文がわかっているレベルで十分)
2. HTML,やCSSについてもざっくり基本的な部分がわかる人。
3. Django未経験者、またはチュートリアルはやったけどちょっとした応用事例を学びたい人。
4. AI(DeapLearning)に興味がある人。
5.家計簿アプリを作って自分の出費を自動で分析したい人。

DjangoのベースはPythonですので、Python基礎知識を理解していることがDjango理解の大前提となります。
また、Pythonには機械学習やDeapLearning開発のための様々なライブラリー(TensorFlow,Kears,scikit-learn)が充実しており、これらとDjangoを組み合わせることで以下の記事でも紹介しているようなAI技術を利用したアプリケーションを作ることもできちゃいます。


サポート体制

本記事に関する質問はいつでも受け付けています。
以下のいづれかの方法でお問い合わせいただければ返信致します。

・TwitterID「@shinya_hd」にDM
問い合わせサイトから質問
※業務都合上返信が遅れる場合があります。

開発環境

Windows10/Anaconda(python3.x)
※なお、本チュートリアルはPython3.6で動作確認済みです。
※ブラウザはChrome推奨です。
(IEでは画面崩れが発生するケースがあります)

また、ソースコードはテキストファイルでも作成できますが、開発ツールを使ったほうが断然便利です。

お勧めはVisual Studio Coldeというツールです。

もしインストールしていない方は事前に下記サイトからインストールしてみてください。(必須ではないので不要という方はスキップしてOKです)

※インストールはネットからダウンロードしてポチポチ押していくだけですのですごく簡単です。

それでは、早速、家計簿アプリ開発を始めてみましょう!

Anacondaの導入

DjangoはPythonをベースとしたWebフレームワークですので、最初にPythonをインストールする必要がありますが、Pythonのいろいろな機能をまとめてインストールできるAnacondaというソフトを利用して環境を構築していきます。

具体的なInstall手順については画像付きで以下のサイトに詳細手順をまとめてありますので、手順を見ながらインストールしてください!

仮想環境の作成

Djangoの開発を進めていくと様々なライブラリーを利用することになりますが、「Aシステム開発ではDajngo1.6を使っているけど、新規B案件ではDjango2.0を利用したい!」といったように異なるバージョンで開発したいというニーズが出てきます。
そんな時にお勧めなのが「仮想環境」です。
仮想環境を作成しておくと、開発案件毎に独立した開発環境を用意することができます。

開発環境の作成は非常に簡単です。
まずは、WindowsのMS-DOS画面を起動しましょう。

Windows10でMS-DOSを起動するには、画面左下にある「ここに入力して検索」の欄で[cmd]と入力して表示された「コマンドプロンプト」を選択することで起動できます。

MS-DOS画面が起動したらコマンドを実行してください。

mkdir c:\django\venv
cd c:\django\venv
python -m venv tutorial
・1行目で「C:\django\venv」フォルダを作成します。
・2行目で作成したvenvフォルダに移動します。
・3行目の「python -m venv [仮想環境名]」コマンドで仮想環境を作成します。
 ※今回は、[tutorial]という仮想環境名を作成します。

仮想環境の作成が完了すると、以下のようにvenvフォルダ配下に仮想環境名「tutorial」の フォルダが生成され、いくつかのフォルダとファイルも併せて生成されます。

画像4

続いて、作成した仮想環境を有効化(Activate)します。
先ほどのDOS画面上で以下のコマンドをコピ&ペーストして実行してください。

.\tutorial\Scripts\activate

すると、以下のように【(仮想環境名) c:\django\venv】という表示に変わります。

画像5

仮想環境が有効化されると、有効化されている仮想環境名が先頭に
(仮想環境名)で表示されます。

先頭に(仮想環境名)が表示されていない場合、仮想環境の有効化に失敗していますので、別途エラー原因を調査する必要がありますので注意してください。

補足ですが、有効化した仮想環境を無効化(deactivate)するには、以下のコマンドを実行します。

deactivate

以上で仮想環境作成については終了です!

【ポイント】
①仮想環境の作成コマンドは「python -m venv [仮想環境名]」
②仮想環境の有効化コマンドは「.\[仮想環境名]\Scripts\activate」
③仮想環境の無効化は「deactivate」

モジュールのインポート

Djangoで開発するためには、必要に応じてモジュールをインストールする必要があります。
モジュールのインストールはPythonのパッケージ管理システム(pipコマンド)を使って行います。
それでは、Django本体のインストールを行います。

今回はDjangoのバージョン2.0.6を導入しますが、以下のコマンドで最新のDjango(2.1.7)を導入しても問題ありません。
pip install django

先程仮想環境を有効化したDOS画面上で以下のコマンドを実行してください。

pip install django==2.0.6

モジュールのインストールは「pip install [モジュール名]==[バージョン] 」という形式で実行します。
「Successfully installed django-2.0.6」というメッセージが表示されたことを確認しましょう!
上記メッセージが確認できたら、djangoがインストールされているか確認してみましょう。
インストールされているモジュールを確認するには[pip list]コマンドを実行します。

(tutorial) c:\django\venv;pip list
Package    Version
---------- -------
Django     2.0.6
pip        18.1
pytz       2018.7
setuptools 39.0.1

上記のとおりバージョン2.0.6のDjangoがインストールされていることが確認できます。
以上でDjangoアプリケーションのインストールは完了です!

【ポイント】
①pip install [モジュール名] ※最新バージョンを入れたい場合はバージョン指定なし
②pip install [モジュール名]=[バージョン] ※バージョン指定する場合

プロジェクトの作成

Djangoは「プロジェクト」と「アプリケーション」という2階層で構成されています。
開発するシステムに対して1つのプロジェクト(プロジェクト専用のフォルダ)というものを作成します。
そして、プロジェクト(フォルダ)の配下にアプリケーションを作成するという流れになります。
プロジェクトは開発するシステムに対して1つだけ作成し、1つのプロジェクトに対して複数のアプリケーションを作成することができます。

画像6

アプリケーションは機能ごとに作成するイメージです。
例えば・・・

アプリケーション①:ユーザ管理機能
アプリケーション②:在庫管理機能
アプリケーション③:受注管理機能
といったイメージです。
実際の開発は、アプリケーションフォルダ内にpythonのコードファイル(拡張子が.py)を作成してコーディングしていくことになります。
それでは、プロジェクトの作成に進みましょう。

プロジェクトの作成は以下のコマンドで行います。
django-admin startproject [プロジェクト名]
では、実際に以下のコマンドを実行してみましょう。

cd c:\django

django-admin startproject tutorial
・1行目で「C:\django」フォルダに移動します。
・2行目でtutorialというプロジェクトを作成します。

すると、以下の通りプロジェクト名[tutorial]のフォルダとファイルが出来上がります。

画像7

以上でプロジェクトの作成は完了です!

開発サーバ起動

WEBアプリケーションを構築するためにはIIS、Apatch、TomcatといったWEBサーバを立てる必要がありますが、Djangoでは上記のようなWEBサーバを構築しなくてもPC上で簡単に疑似的なWEBサーバを起動させることができます。

それでは、開発サーバを起動させてみましょう!
以下のコマンドを実行してください。

cd c:\django\tutorial

python manage.py runserver
・1行目でプロジェクトフォルダ「C:\django\tutorial」に移動します。
・2行目で開発サーバを起動します。
※注意 開発サーバの起動コマンドは「manage.pyというファイルがある場所で実行する必要があります。

http://127.0.0.1:8000/にアクセスして以下の画面が表示されればOKです!

画像8

続いて、WEBページが英語表示なので、日本語に変更します!

言語設定(英語⇒日本語)

言語を変更するにはdjangoのsettings.pyというファイル内のパラメータを変更します。
まず、以下のフォルダにあるsettngs.pyを開きます。

C:\django\tutorial\tutorial\settings.py

ずっと下のほうに行くと以下の記述があります。

LANGUAGE_CODE = 'en-us'
TIME_ZONE = 'UTC'

上記パラメータを以下のとおり変更して保存してください。

LANGUAGE_CODE = 'ja'
TIME_ZONE = 'Asia/Tokyo'

ブラウザを更新して以下の通り日本語になればOKです!

画像9

データベースの設定

Djangoでは様々なデータベース(Oracle,Mysql,Postgress,Sqlserver)をサポートしていますが、このチュートリアルではデフォルトで設定されているファイルベースデータベース(SQlite)を使いますので、今回は特別な設定は不要です。

【参考】
データベースの接続設定は、settings.pyファイルの「DATABASES」パラメータで行います。
接続するデータベースの種類によって、若干設定内容が異なってきますがここでは詳細は割愛します。

アプリケーションの作成

webシステムを開発するためにはDjangoのアプリケーションを作成する必要があります。
今回は、家計簿アプリということで「kakeibo」という名前のアプリケーションを作成します。
先ほど開発サーバを起動したDOS画面はそのままにして、新しく別のDOS画面を起動しましょう。

DOS画面を起動したら、まず、以下のコマンドで仮想環境を有効化することを忘れないようにしてください。

cd c:\django\venv
.\tutorial\Scripts\activate


続いて以下のコマンドを実行してください。

cd c:\django\tutorial
python manage.py startapp kakeibo

以下のようにプロジェクト「tutorial」フォルダ直下にアプリケーションのフォルダとファイルが自動生成されます。

画像10

以下、参考程度ですが各ファイルの概要になります。
※細かいことはまだわからなくても大丈夫です。

画像11

以上で、アプリケーション作成は完了です!

Djangoアプリケーションの全体構成

いよいよ本格的にwebアプリケーション開発に入っていきますが、
ここでDjangoアプリケーション開発の流れと全体像について簡単に説明しておきます。
最初からあまり細かい部分まで理解する必要はありませんので、ポイントだけ理解すれば大丈夫です。
開発のイメージは既にでてきましたが、ざっくり以下のようなイメージです。

画像12

・1つのプロジェクトを作る
・機能ごとにアプリケーションを作る
・アプリケーションフォルダ内の***.pyファイルやhtmlファイルをコーディングしていく。

なお、今回のチュートリアルではアプリケーションは1つだけ作成します。

Djangoの設計思想

DjangoはMVTという設計モデルを採用しており、このMVTが基本になってきます。
MVTの概要は以下の通りです。
【ファイル名】列に記載されたファイルで具体的にコーディングを行っていきます。

画像13

上記を踏まえ、今回開発する家計簿アプリのDjangoの全体設計は以下のようになります。

画像14

ざっくりと全体の構成をイメージしておきましょう!

・モデルの定義(M)は「models.py」で行います。
・ビューの定義(V)は「views.py」で行います。
・テンプレート定義(T)は共通テンプレートと子テンプレートの2階層に分けます。
※上記3つが先ほど出てきたMVTです。

上記図にはMVT以外に「urls.py」と「admin.py」というものが登場していますが、これは以下のような機能です。

admin.py:作成したアプリケーションをadminサイトという管理サイトに表示させるための各種設定をするファイル。(adminサイトではデータの登録、変更、削除が簡単に行える便利な管理サイトのことです)
urls.py:WEBのURL(http://****/kakeibo/list等)の設計をするファイル。

全体処理の流れはざっくり説明すると、以下のようなフローになります。
全体の処理イメージが何となくつかめればOKです!

①WEBのURLにアクセスする。
②urls.pyに定義されたURLパターンにマッチするビュー関数(views.py内に定義する)を呼び出す。
③ビューで定義された各種処理を実行後に処理結果をテンプレートファイル(html)に渡す。
 ※ビューでは必要に応じてデータベースからデータを取得したりします。
④テンプレート(html)はビューで処理された結果を受け取りWEBページに結果を表示する。

それでは、つぎから具体的な開発に着手していきます!

モデルの作成

Djangoのモデル(M)ではテーブルの情報(主キー、データ長、データ型など)を定義していきます。
Djangoでは、直接SQL分を実行してデータベースへテーブルを作成するのではなく、事前にモデル(models.py)にテーブルの情報を定義しておき、「マイグレーション」という機能を使って自動でデータベースへ反映してきます。
以下のようなイメージです。

画像15

通常データベースへのテーブルの実行はSQL文を直接実行するのですが、Djangoではマイグレーション機能を利用することで事前に定義しておいたテーブル情報を元にSQL文を自動生成した後にデータベースへ反映する処理が実行されます。

それでは、モデルの定義を行っていきます。
まず、以下のファイルを開いてください。

C:\django\tutorial\kakeibo\models.py

初めは以下のようなコードが1行だけ記載されていますので、ここに必要なコードを追記していきます。

from django.db import models
# Create your models here.

今回のチュートリアルでは、家計簿アプリを作成していきますが、テーブルとしては下図のように「家計簿テーブル」と「カテゴリテーブル」の2つを作成していきます。

画像16

それではまず、models.pyファイルに以下のようなコードを追加してください。(この後1つ1つ説明していきますので大丈夫です!)

from django.db import models   
# Create your models here.

class Category(models.Model):   
   class Meta:
       #テーブル名の指定
       db_table ="category"
     
  #カラム名の定義
   category_name = models.CharField(max_length=255,unique=True)

Djangoではテーブルの定義をPythonのクラスとして定義していきます。
クラスを定義する際に、Django標準のmodelsクラスというものを承継してテーブルのクラス(上記例ではCategory)を定義する形になります。
まず1行目の以下のコードでDjango標準のmodelsクラスをインポートしています。

from django.db import models   

そして、3行目の以下の部分でDjango標準のmodelsクラスを承継してカテゴリテーブル用のクラス「Category」を定義しています。

class Category(models.Model):   

次に、定義したCategoryクラスの中にさらに「Meta」という名称でクラスを定義し、Metaクラス内にテーブル名を指定していきます。
テーブル名の指定は、「db_table = "テーブル名"」という形で指定します。

class Meta:
       #テーブル名の指定
       db_table ="category"

なぜMetaクラス内にdb_tableを定義するかと思った方もいると思います。

これはDjangoの仕様でテーブル名やこの後出てくるverbose_name (表示名の単数形)と verbose_name_plural(表示名の複数形)はMetaクラス内に定義するルールになっているからですので、あまり深いことは考えず、「こういうものだ」くらいに思ってもらってOKです。

最後に、テーブル項目をCategoryクラスのクラス属性として定義していきます。
今回は、カテゴリテーブルの項目として「カテゴリ名」だけ定義しますので、以下の部分でカテゴリ名を定義しています。

category_name = models.CharField(max_length=255,unique=True)

テーブル項目は以下のフォーマットに従い定義します。

<項目名> = models.<データ型>(フィールドオプション)

まずはデータ型ですが、これは文字通りカラムのデータ型を指定します。
データ型には様々なものがありますが、このチュートリアルで利用するデータ型(3つ)について以下にまとめました。

画像17

文字列型は「交通費」、「家賃」といった文字をカラムのデータとして利用する場合に指定します。
数値型は「金額」のような数字を項目にしたい場合に指定します。
日付型は「2018年11月」のような日付型を指定する場合に指定します。

続いてフィールドオプションです。
フィールドオプション部分には、テーブル項目に対する属性を定義していきます。
具体的には以下のような属性があります。

画像18

今回のチュートリアルでは、主に以下の4つを利用します。

max_length / unique / default / verbose_name

この先、上記以外にもいくつかフィールドオプションが出てきますが、都度説明していきますので大丈夫です!
さて、もう一度カテゴリテーブルのカラム名「カテゴリ」の定義を見てみましょう。

<項目>         = models.<データ型>(~~~~~~フィールドオプション~~~~~)
  ↓                       ↓           ↓
<項目>         = models.<文字列型>(最大サイズ=255, ユニーク属性あり)
  ↓                       ↓        ↓        ↓ 
category_name = models.CharField(max_length=255,unique=True)

こんな感じでテーブルの項目を必要に応じて定義しています。
※ちなみにunique=Trueとすることで重複した値を登録できなくなります。
※家計簿のカテゴリ名は重複して登録されるとこまりますよね。

さて、今回のチュートリアルでは以下2つのテーブルを定義すると言いました。

①カテゴリテーブル(カテゴリの種類を格納するためのテーブル)
②家計簿テーブル(家計簿のデータを格納するテーブル)

まずは全体イメージをつかんでおきましょう。

画像19

ここで1つ抑えていただきたいポイントがあります。
テーブルのリレーション」についてです。

テーブルのリレーション

複数テーブル間でモデルを構成するにはリレーションを定義する必要があります。
リレーションには3種類(、多対多)がありますが、ここでは一番よく利用する「」について説明します。

今回の家計簿アプリの例で説明しますね。

画像20

上図のようにカテゴリテーブルのある1レコード(食費)に対して複数のレコード(家計簿データ)が関連づけられています。
一方、家計簿テーブル上の1レコードは必ず1つのカテゴリ名に紐づいています。
このようなテーブル間の関係を「」といいます。

Djangoでは「」のリレーションを設定する場合に「多側」に
外部キー」というものを定義します。
今回のチュートリアルでは、家計簿テーブルにカテゴリテーブルを参照する外部キーをつけます。(以下のイメージです)

画像21

改めて、全体のテーブル構成を見てみましょう。

画像22

多側」である「家計簿テーブル」に「カテゴリテーブル」を参照する
外部キー」を設定することで、テーブル間のリレーションを設定します。

実際のコーディングにおいてDjangoのモデルでは「」側のモデルに「ForeignKey」フィールドを持たせることでリレーションを実現できます。

それでは、新たに家計簿テーブルを定義して、カテゴリテーブルとの間にリレーションを設定してみましょう。
models.pyに以下のコードを追加してください。

class Kakeibo(models.Model):
   class Meta:
       #テーブル名
       db_table ="kakeibo"

   #カラムの定義
   date = models.DateField(verbose_name="日付",default=datetime.now)
   category = models.ForeignKey(Category, on_delete = models.PROTECT, verbose_name="カテゴリ")
   money = models.IntegerField(verbose_name="金額", help_text="単位は日本円")
   memo = models.CharField(verbose_name="メモ", max_length=500)

家計簿テーブルの定義もカテゴリテーブル同様にPythonのクラスとして定義していきます。

以下で、models.Modelを承継して「Kakeibo」という名称で家計簿テーブルクラスを定義し、

class Kakeibo(models.Model):

Metaクラスのクラス属性としてテーブル名「db_table = "kakeibo"」を定義します。

class Meta:
       #テーブル名
       db_table ="kakeibo"

最後にKakeiboクラスの属性としてkakeiboテーブルのカラムを定義します。

#カラムの定義
   date = models.DateField(verbose_name="日付",default=datetime.now)
   category = models.ForeignKey(Category, on_delete = models.PROTECT, verbose_name="カテゴリ")
   money = models.IntegerField(verbose_name="金額", help_text="単位は日本円")
   memo = models.CharField(verbose_name="メモ", max_length=500)

今回は上記の通り、「日付、カテゴリ名、金額、メモ」を表すカラムを定義しました。

まず「日付」ですが、Date型を使うには以下のコマンドを実行してdatetimeメソッドをインポートしておく必要があるので、models.pyの最初ほうに追加します。

from django.db import models
from datetime import datetime    #追加する


つづいてカラム「日付」を以下で定義しています。

date = models.DateField(verbose_name="日付",default=datetime.now)

データ型に日付型「DateFileld」、
フィールドオプションに項目名の説明「verbose_name="日付"」を定義、
デフォルトの設定値として現在日付(datetime.now)を指定しています。

1つ飛ばして「金額」は以下の通り、

money = models.IntegerField(verbose_name="金額", help_text="単位は日本円")

データ型に数値型「IntegerField」を指定、
フィールドオプションに項目名の説明「verbose_name="金額"」を定義し、「help_text="単位は日本円"」を設定しています。

ここで新しく出てきたフィールドオプション「help_text」は、フィールドに補助的な説明を表示させる際に便利です。
※以下のようなイメージ(赤枠がhelp_textで指定した内容)

画像23

最後に以下コードで、カテゴリテーブルを参照する外部キーを設定します。

category = models.ForeignKey(Category, on_delete = models.PROTECT, verbose_name="カテゴリ")

外部キーを設定する場合は、以下のような形式で項目を定義します。

[項目名] = models.ForeignKey([参照先のテーブルクラス名], on_delete=[オプション],[その他のフィールドオプション])
[項目名]  = models.ForeignKey([参照先  , on_delete = [オプション]     ,[その他のフィールドオプション)
                            ↓              ↓             ↓
category = models.ForeignKey(Category, on_delete = models.PROTECT, verbose_name="カテゴリ")

ここで新しく「on_delete」オプションというものが出てきました。

これは、Djangoバージョン2.0から必須となったオプションで、参照するオブジェクトが削除されたときに、それと紐づけられたオブジェクトも一緒に削除するかどうかを設定するものです。
以下のような種類があります。

画像24

いろいろありますが、今回は参照されているものがある場合に誤って削除されないようにPROTECT(保護する)を設定しています。

このチュートリアルの例で説明すると、PROTECTを設定すると削除しようとしたカテゴリ名「交通費」に際に紐づいた家計簿データが存在すると以下のようにカテゴリを削除できなくなります。

画像25

この例でカテゴリ「交通費」を削除するには、まず家計簿テーブル側で交通費に紐づいているレコードを削除する必要があるわけです。

ここまでで、カテゴリテーブルと家計簿テーブルの基本的なテーブル定義が完了しました。
完成したコードは以下のようになります。

from django.db import models
from datetime import datetime

class Category(models.Model):
   class Meta:
       #テーブル名
       db_table ="category"
            
#カラム名の定義
   category_name = models.CharField(max_length=255,unique=True)
 
class Kakeibo(models.Model):
   class Meta:
       #テーブル名
       db_table ="kakeibo"

   #カラムの定義
   date = models.DateField(verbose_name="日付",default=datetime.now)
   category = models.ForeignKey(Category, on_delete = models.PROTECT, verbose_name="カテゴリ")
   money = models.IntegerField(verbose_name="金額", help_text="単位は日本円")
   memo = models.CharField(verbose_name="メモ", max_length=500)

モデルの定義が完了しましたので、マイグレーションを実行してデータベースへテーブルを登録していきましょう。

settings.pyのINSTALLED_APPSにアプリを追加する


マイグレーションを実行するといいましたが、その前に今回作成したアプリケーション「kakeibo」をsettngs.pyファイルのINSTALLED_APPSというパラメータに追加する必要があります。
C:\django\tutorial\tutorial\settngs.pyを開いて以下の通り追加してください。

INSTALLED_APPS = [
   'django.contrib.admin',
   'django.contrib.auth',
   'django.contrib.contenttypes',
   'django.contrib.sessions',
   'django.contrib.messages',
   'django.contrib.staticfiles',
   'kakeibo',   #ここを追加 「最後の「,」を忘れずに!
]

よくやってしまうのが、上記設定をする前にマイグレーションを実行して以下のエラーが出るパターンです。

(tutorial) C:\django\tutorial>python manage.py makemigrations kakeibo
App 'kakeibo' could not be found. Is it in INSTALLED_APPS?

マイグレーション

それでは、マイグレーションを実行していきます。
マイグレーションには以下の2ステップあります。

①モデル定義からマイグレーション用のファイルを生成
②マイグレーションファイルに基づいてデータベースへテーブルを作成

まず、以下のコマンドで①(マイグレーションファイルの生成)を実行します。
python manage.py makemirations [アプリケーション名]

python manage.py makemigrations kakeibo

以下のように表示されればOKです!

Migrations for 'kakeibo':
 kakeibo\migrations\0001_initial.py
   - Create model Category
   - Create model Kakeibo

続いて以下のコマンドで②(データベースにテーブルを作成)を実行します。

python manage.py migrate

以下のようにすべて「OK」と表示されればOKです!

Operations to perform:
  Apply all migrations: admin, auth, contenttypes, kakeibo, sessions
Running migrations:
  Applying contenttypes.0001_initial... OK
  Applying auth.0001_initial... OK
  Applying admin.0001_initial... OK
  Applying admin.0002_logentry_remove_auto_add... OK
  Applying contenttypes.0002_remove_content_type_name... OK
  Applying auth.0002_alter_permission_name_max_length... OK
  Applying auth.0003_alter_user_email_max_length... OK
  Applying auth.0004_alter_user_username_opts... OK
  Applying auth.0005_alter_user_last_login_null... OK
  Applying auth.0006_require_contenttypes_0002... OK
  Applying auth.0007_alter_validators_add_error_messages... OK
  Applying auth.0008_alter_user_username_max_length... OK
  Applying auth.0009_alter_user_last_name_max_length... OK
  Applying kakeibo.0001_initial... OK
  Applying sessions.0001_initial... OK

これでテーブルの定義と実装が完了しました!
続いて、Django標準で用意されているAdminサイトの設定を行っていきます。

管理者権限ユーザの作成

まず、Adminサイトにアクセスするためのユーザを作成する必要があるため、以下のコマンドで管理者ユーザを作成します。
python manage.py createsuperuser

python manage.py createsuperuser

Username (leave blank to use 'admin'): kakeibo_user ←ユーザ名を入力
Email address:                   ←何も入力せずEnterキーを押す
Password:                      ←好きなパスワードを入力
Password (again):                 ←パスワードを再入力
Superuser created successfully.

上記の通り「Superuser created sucessfully」と表示されればOKです!

では、Adminサイト「http://127.0.0.1:8000/admin」へアクセスしてみましょう!
python manage.py runserverコマンドを実行して開発サーバを起動しておいてください!

先ほど作成したユーザ名「kakeibo_user」でログオンします。

画像26

以下の画面が表示されます。

画像27

先ほど作成したアプリケーション「kakeibo」はまだ表示されていない状態なので、アプリケーションを管理画面に表示する設定を行っていきます。

adminサイトの設定

DjangoではデータベースにマイグレーションしたテーブルデータをDjangoの標準機能であるadminサイト上で管理することができます。
作成したモデル(テーブル)をadminサイト上に表示するにはアプリケーションフォルダ配下に存在するadmin.pyを編集します。

それではC:\django\tutorial\kakeibo\admin.pyファイルを開いてください。
最初は以下のような内容になっていますので、ここにコードを追加していきます。

from django.contrib import admin
# Register your models here.

以下の通りコードを追加してください!

from django.contrib import admin

# Register your models here.

#ここから下を追加
from .models import Category, Kakeibo

admin.site.register(Category)
admin.site.register(Kakeibo)

【ソースコードの説明】
まず最初に以下のコードで先ほど作成したmodels.pyファイルからCategoryクラスとKakeiboクラスをインポートします。

from .models import Category, Kakeibo

上記コードは、「.models」で同じフォルダ配下にある「models.py」を意味し、models.py内に定義されているCategoryクラスとKakeiboクラスをImportするという意味です。

つづいて以下のコードを追加して、先ほど読み込んだCategoryとKakeiboクラスをadminサイトに表示します。
adminサイトに登録するには「admin.site.register」というメソッドを利用します。

admin.site.register(Category)
admin.site.register(Kakeibo)

admin.pyファイルを保存したらAdminサイトを更新してみてください!
下図の赤枠のようにkakeiboアプリケーションのテーブルが表示されます。

画像28

このままでも使えますが、テーブル名がアルファベットになっていてわかりづらいので表記を日本語に変更してみます。

Adminサイト上のテーブル名表示を日本語に変更するにはmodels.pyを編集します。
具体的には、各テーブルクラス内のMetaクラス内に「verbose_nameverbose_name_plural」というパラメータを以下の通り追記していきます。

class Category(models.Model):   
    class Meta:
       #テーブル名の指定
       db_table ="category"
       verbose_name ="カテゴリ"         #追加
       verbose_name_plural ="カテゴリ"  #追加
class Kakeibo(models.Model):
   
   class Meta:
       #テーブル名
       db_table ="kakeibo"
       verbose_name ="家計簿"          #追加
       verbose_name_plural ="家計簿"   #追加

Adminサイトを更新してみてください。
下図赤枠の通りテーブル名の表示が日本語に変わればOKです!

画像29

つづいて、テーブルのデータを登録してきます!

テストデータの登録

adminサイトのTOP画面で、カテゴリの「追加」ボタンを押します画像30

カテゴリの登録画面が表示されるので、「Category name」の欄に登録したいカテゴリーを入力して、「保存してもう1つ追加」ボタンを押します。

画像31

同様の手順でカテゴリを追加していきます。
今回は、「食費、交通費、雑費」の3つを登録します。
以下の通り3つのカテゴリを登録してください。

画像32

カテゴリを3つ登録すると以下のような画面になります。

画像33

デフォルトのままだとデータの内容が「Category object(3)」というようにわかりづらい表示になっていて何が登録されているかわかりませんよね・・・・
わかりやすい表示になるように修正していきます。
テーブルのデータの表示を変更するには、これもまたmodels.pyファイルを修正していきます。
models.py内の各テーブルクラスの最後に以下のような関数を追加します。
関数の戻り値に表示したいカラム名を指定すると、そのカラム名がadminサイトの一覧表示項目として表示されるようになります。

def __str__(self):
       return self.[表示したいカラム名]

Djangoで利用する上記の「__str__(self)」関数は、adminサイトで表示される文字列を定義するために利用します。

ちなみに、「__str__(self)」関数は、pythonの特殊メソッドと呼ばれるものの1つで、組み込み関数str()を使ってオブジェクトを文字列型に変換するときに呼び出される関数です。
(print()関数実行時などに暗黙的に呼び出されていたりします)

実際に追加したコードは以下の通りです。

class Category(models.Model):   
   class Meta:
      #テーブル名の指定
      db_table ="category"
      verbose_name ="カテゴリ"
      verbose_name_plural ="カテゴリ"
   
   #カラム名の定義
   category_name = models.CharField(max_length=255,unique=True)
   #ここから追加
   def __str__(self):
       return self.category_name
   
class Kakeibo(models.Model):
   
   class Meta:
       #テーブル名
       db_table ="kakeibo"
       verbose_name ="家計簿"
       verbose_name_plural ="家計簿"
       
   #カラムの定義
   date = models.DateField(verbose_name="日付",default=datetime.now)
   category = models.ForeignKey(Category, on_delete = models.PROTECT, verbose_name="カテゴリ")
   money = models.IntegerField(verbose_name="金額", help_text="単位は日本円")
   memo = models.CharField(verbose_name="メモ", max_length=500)

  #ここから追加
   def __str__(self):
       return self.memo

adminサイトを更新すると、以下の通りカテゴリテーブルのデータ内容が実際に登録した内容で表示されるようになります!

画像34

さて、つづいて家計簿にデータを登録します。

adminサイトのホーム画面に戻り、今度は「家計簿」の「追加」ボタンを押します。

画像35

「日付」、「カテゴリ」、「金額」、「メモ」の内容を選択または入力してデータを保存していきます。

同様の手順で家計簿データを複数登録してください。

以下の画像では2018年11月~2019年1月のデータを12件登録しました。
が、表示にカラムの「メモ」しか表示されていません!
これでは何が登録されているかわかりづらいですよね・・・・

画像36

ということで、テーブル内のデータの各カラムに何が登録されているかを表示させてみましょう!
テーブルデータのカラム表示設定は、admin.pyファイルで設定していきます。

from django.contrib import admin
# Register your models here.
from .models import Category, Kakeibo

admin.site.register(Category)
admin.site.register(Kakeibo)

上記の設定から以下の通り変更してください。

from django.contrib import admin

# Register your models here.
from .models import Category, Kakeibo

#追加
class KakeiboAdmin(admin.ModelAdmin):
    list_display=('date','category','money','memo')

admin.site.register(Category)
admin.site.register(Kakeibo,KakeiboAdmin)       #修正

追加した箇所は以下です。

#追加
class KakeiboAdmin(admin.ModelAdmin):
   list_display=('date','category','money','memo')

テーブルのカラム表示の指定には、admin.ModelAdminクラスを承継した任意のクラス名を定義して、「list_display」という属性を利用します。

そして、list_displayの値に表示したいテーブルのカラム名を指定します。

上記では、admin.ModelAdminクラスを承継したKakeiboAdminクラスを新たに定義し、KakeiboAdminクラス属性としてlist_displayを定義し、値として
家計簿テーブルのカラム「日付、カテゴリ、金額、メモ」を指定しています。

つづいて、修正した箇所は以下です。

admin.site.register(Kakeibo,KakeiboAdmin)       #修正

先ほどlist_displayで表示したいカラムを定義したクラス「KakeiboAdmin」を
admin.site.registerの引数に指定してあげます。
こうすることで、Adminサイトにlist_displayで指定したカラムが表示されるようになります。

画像37

以上でAdminサイトの設定は完了です!

それでは、いよいよ次から本格的にCRUD画面を開発していきます。

CRUDとは?

WEBアプリではよくCRUDという言葉が出てきます。
CRUDとは以下の基本機能のことを総称したものです。

CREATE(新規作成ページ)
READ(一覧表示ページ)
UPDATE(更新ページ)
DELETE(削除ページ)
頭のアルファベットをつなげてCRUDと呼んでいます。

Djangoでは標準で用意されている汎用ビューと呼ばれるビュー機能を利用することでCRUD機能を備えたWEBアプリを簡単に開発することができます。

それでは、まずは一覧表示(READ)画面から開発していきましょう!

この続きをみるには

この続き: 74,739文字 / 画像44枚
この記事が含まれているマガジンを購入する
Djangoの環境構築からCRUD WEBアプリ開発+α Djangoの応用事例を学習したい人にお勧めです。 ボリュームは約13万字ありますので、200~300ページ程度の技術書と同等のボリュームがあると思います。 初心者用に図解を多く(約90枚)取り入れて、説明も多く掲載しています。

以下のコースをまとめた割引プランです。 ・Djangoで毎月の出費を分析できる家計簿アプリをつくろう!【基礎編】 ¥980 ・Djan…

または、記事単体で購入する

Djangoで毎月の出費を分析できる家計簿アプリをつくろう!【基礎編】

siny

980円

この記事が気に入ったら、サポートをしてみませんか?
気軽にクリエイターの支援と、記事のオススメができます!
siny

主にITテクノロジー系に興味があります。 【現在興味があるもの】 python、Django,統計学、機械学習、ディープラーニングなど。 技術系ブログもやってます。 https://sinyblog.com/

「スキ」有難うございます!
主にITテクノロジー系に興味があります。 python、Django、機械学習、ディープラーニングなど。 技術系ブログもやっております。 https://sinyblog.com/