本当に初めての人でもわかるDjango入門チュートリアル

スポンサードリンク



こんにちわ! 管理人のsinyです。
この記事はDjango入門者向けのチュートリアルです。
Django入門者向けにDjango開発を始めるにあたって必要となるタスク全般の基礎知識についてまとめました。

一般的なチュートリアル記事より手順を詳細に記載していますので、この記事を通じてDjangoに関わる人が一人でも増えたら幸いです!

また、Django入門者向けのチュートリアルノートも配信していますので、こちらもぜひチェックしてみてください。

特に初心者の方で、本記事の内容について質問がありましたら、問合せフォーム、またはTwitterから受け付けていますのでお気軽にどうぞ。

Django開発環境について(2019年3月17日更新

本チュートリアルでは、以下の環境でDjangoを開発することを前提に記載しています。

区分 バージョン
OS Windows10
Python 3.6.5
Django 2.1.7
※Django最新バージョン(2.1.7)でも問題ないことを確認済み
※上記とは違う環境(ubuntu,Linuxなど)では細かい実行コマンド手順が異なります
 
Django開発環境を構築するためには、事前にAnaconndaを導入しておく必要があります。
Anaccondaの導入がまだの方は、下記の記事を参考にして最初にAanacondaを導入してください。
 

それでは、Djangoチュートリアルを進めていきます。

仮想環境の作成

Djangoの開発を進めていくと様々なライブラリーを利用することになりますが、開発案件毎に

異なるバージョンを利用したいというニーズが出てきます。

Aシステム開発ではDajngo1.6を使っているけ

ど新規B案件ではDjango2.0を利用したい!

そんな時は仮想環境を利用すればいいですよ!
ローカルPC環境内に仮想環境を作成することで、

開発プロジェクト毎に独立した開発環境を準備

することができます。

開発環境の作成は非常に簡単です。

Windowsの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]という仮想環境名を作成しています。

 

Windows10ではMS-DOSを起動するには、画面左下にある「ここに入力して検索」の欄で[cmd]と入力して表示された「コマンドプロンプト」を選択することで起動できます。
 
仮想環境の作成が完了すると、以下のようにvenvフォルダ配下に仮想環境名「tutorial」の フォルダが生成され、いくつかのフォルダとファイルも併せて生成されます。
 
 
続いて、作成した仮想環境を有効化(Activate)します。
先ほどのDOS画面上で以下のコマンドを実行してください。
 
.\tutorial\Scripts\activate

 

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

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

 
仮想環境が複数存在する場合は、以下のコマンドの赤字部分を有効化したい仮想環境名に変更して実行してください。
「.\[仮想環境名]\Scripts\activate」
 
最後に、有効化した仮想環境を無効化(deactivate)するには、以下のコマンドを実行します。
deactivate
 
①仮想環境の作成コマンドは「python -m venv [仮想環境名]
②仮想環境の有効化コマンドは「[仮想環境名]\Scripts\activate
③仮想環境の無効化は「deactivate
 

Djangoモジュールのインポート

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

モジュールのインポート(通常の場合)

まず最初に、pipコマンド自体を最新バージョンにアップデートします。
仮想環境を有効化した状態で、以下のコマンドを実行します。

python -m pip install --upgrade pip

Successfully installed pip-xx.x」というメッセージが表示されたことを確認します。

最初にpipコマンドを最新化しておかないと、モジュールのインストールやpipコマンドがエラーで動かないことがあるので、最初に最新化しておきましょう!

 

それでは、続いてDjango本体のインストールを行います。
今回はDjangoのバージョン2.0.6を導入します。
以下のコマンドを実行してください。

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

Package列にモジュール名、Version列にバージョンが表示されます。
上記4行目を見るとバージョン2.0.6のDjangoがインストールされていることが確認できます。

モジュールのインポート(Proxy環境の場合)

個人開発のケースではあまり問題にならないと思いますが、社内ネットワーク環境下でモジュールのインポートを行う場合、大抵のケースでProxyの問題でインポートエラーとなります。

Proxy環境下でpip installコマンドを実行する場合は以下の形式でコマンドを実行する必要があります。

pip install [モジュール名] --proxy [プロキシアドレス]:[ポート番号]

以下は具体例です。

pip install django==2.0.6 --proxy http://10.155.3.123:80

Proxy環境下でモジュールをインポートする度に毎回proxyオプションを指定するのは結構面倒くさいので、以下の設定を一度行っておくと便利です。

①Anacondaのルートフォルダに.condarcファイルを作成します。

②作成した.condarcファイルを開いて以下を記述して保存します。

proxy_servers:
    http: http://[プロキシアドレス]:[ポート番号]
    https: https://[プロキシアドレス]:[ポート番号]

以上でモジュールのインポート手順の説明は終わりです。

①pip install [モジュール名] ※最新バージョンを入れたい場合はバージョン指定なし
②pip install [モジュール名]=[バージョン] ※バージョン指定する場合
③pip install [モジュール名] --proxy[プロキシアドレス]:[ポート番号] ※Proxy環境の場合

Djangoプロジェクトの作成

Djangoでは「プロジェクト」と「アプリケーション」という2階層で構成されています。
開発するシステムに対して1つのプロジェクト(単なるフォルダ)というものを作成します。

そして、プロジェクト(フォルダ)の配下にアプリケーションを作成するという流れになります。

プロジェクトは開発するシステムに対して1つだけ作成し、1つのプロジェクトに対して複数のアプリケーションを作成することができます。

アプリケーションはどのような単位

で作成するのでしょうか?

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

例えば・・・

アプリケーション①:ユーザ管理機能

アプリケーション②:在庫管理機能

アプリケーション③:受発注管理機能

といったイメージです。

 

実際の開発は、アプリケーションフォルダ内にpythonのコードファイル(拡張子が.py)を作成して
コーディングしていくことになります。

それでは、プロジェクトの作成に進みましょう。

プロジェクトの作成は以下のコマンドで行います。

django-admin startproject [プロジェクト名]

では、実際に以下のコマンドを実行してみましょう。

cd c:\django

django-admin startproject tutorial

 

・1行目で「C:\django」フォルダに移動します。
・2行目でtutorialというプロジェクトを作成します。
 
すると、以下の通りプロジェクト名[tutorial]のフォルダとファイルが出来上がります。

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

開発サーバの起動

WEBアプリケーションを構築するためにはIIS、Apache、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です!

 

ちなみに、複数のプロジェクトを作成していて、ポート番号がかぶっていしまう場合は、
以下のように最後にポート番号をしていすると開発サーバで利用されるポート番号を任意に指定することができます。
 
python manage.py runserver [ポート番号]
 
 
続いて、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です!

 

 

 

データベースの設定

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

 

データベースの接続設定は、settings.pyファイルの「DATABASES」パラメータで行います。
接続するデータベースの種類によって、若干設定内容が異なってきます。
参考にsqliteとMySQLを使った場合のDB接続の設定例を以下に記載します。
 

sqliteの場合

 

DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
}
}

 

上記は、Djangoデフォルトの状態です。
'ENGINE'の部分で利用するデータベースの種類を指定します。
’NAME'の部分でデータベースファイルの場所を指定しています。
 

MySQLの場合

データベースにMySQLを利用する場合は、以下のような設定になります。

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'データベース名',
        'USER': 'DB接続ユーザ名',
        'PASSWORD': 'パスワード',
        'HOST': 'dbサーバ名',
        'OPTIONS': {
            'charset': 'utf8mb4',
        },
    }
}

接続するデータベースはあらかじめ作成しておく必要があります。
また、OPTIONSとしてデータベースのcharasetを指定することができます。

Djangoアプリケーションの作成

webシステムを開発するためにはDjangoのアプリケーションを作成する必要があります。

今回は、家計簿アプリを作成するという前提で「kakeibo」という名前のアプリケーションを作成します。

DOS画面上で以下のコマンドを実行してください。
(実行場所はc:\django\tutorial)

python manage.py startapp kakeibo

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

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

 

モデルの作成

 

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

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

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

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

 

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

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

 

それではまず、models.pyファイルに以下のようなコードを追加してください。
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クラス内に定義するルールになっているからですので、あまり深いことは考えなくていいです。

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

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

 

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

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

まずはデータ型ですが、これは文字通りカラムのデータ型を指定します。
データ型には様々なものがありますが、基本的なものを以下にまとめました。

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

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

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

max_length / unique / default / verbose_name

 

さて、もう一度カテゴリテーブルのカラム名「カテゴリ」の定義をもう一度見てみましょう。

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

 

こんな感じでテーブルの項目を必要に応じて定義しています。
※ちなみにunique=Trueとすることで重複した値を登録できなくなります。

このチュートリアル記事では以下2つのテーブルを定義していきます。

 

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

 

まずは全体イメージをお見せします。

 

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

テーブルのリレーション

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

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

上図のようにカテゴリテーブルのある1レコード(食費)に対して複数のレコード(家計簿データ)が関連づけられています。

一方、家計簿テーブル上の1レコードは必ず1つのカテゴリ名に紐づいています。
このようなテーブル間の関係を「」といいます。

Djangoでは「」のリレーションを設定する場合に「多側」に
外部キー」というものを定義します。

今回のチュートリアルでは、家計簿テーブルにカテゴリテーブルを参照する外部キーをつけます。(以下のイメージです)

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

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

実際のコーディングにおいて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で指定した内容)

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

 

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から必須となったオプションで、参照するオブジェクトが削除されたときに、それと紐づけられたオブジェクトも一緒に削除するかどうかを設定するものです。
以下のような種類があります。

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

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

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

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

 

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)

 

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

 

Djangoマイグレーション

 

マイグレーションを実行するといいましたが、その前に今回作成したアプリケーション「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&nbsp;makemigrations kakeibo

 

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

 

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

 

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

python manage.py&nbsp;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チュートリアルNote記事で学ぶことができますのでチェックしてみてください。

Djangoで毎月の出費を分析できる家計簿アプリをつくろう!【基礎編】
おかげさまで、以下のようなコメントを頂いています。
 
Django初心者向けにかなり丁寧に解説しているので、自信をもって初心者の方にお勧め致します。
Djangoで毎月の出費を分析できる家計簿アプリをつくろう!【応用編】
Django Webアプリ開発コース(基礎編+応用編セット)

この記事が良かったと思う方はTwitterフォロー(shiny)とリツイート頂けると嬉しいです!

おすすめの記事