・本書の内容についてのご意見、ご質問は、お名前、ご連絡先を明記のうえ、小社出版部宛文書（郵送または E-mail）でお送りください。
・電話によるお問い合わせはお受けできません。
・本書の解説範囲を越える内容のご質問や、本書の内容と無関係なご質問にはお答えできません。
・匿名のフリーメールアドレスからのお問い合わせには返信しかねます。
本書で取り上げられているシステム名／製品名は、一般に開発各社の登録商標／商品名です。本書では、™ および ® マークは明記していません。本書に掲載されている団体／商品に対して、その商標権を侵害する意図は一切ありません。本書で紹介している URL や各サイトの内容は変更される場合があります。

前書き

本書は、Web フレームワーク Django（バージョン 2.2）の基本を習得するための書籍です。

Django フレームワークとは何かを簡単に言うと、Python で凝った Web サイトを作るための便利なプログラム集です。
知り合いに Django フレームワークを薦められたり、入社した会社が Django フレームワー
クを使うようだけど、自分に合った Django フレームワークのチュートリアルが見つからない方、他にも、Python の基本的な文法は知っており、Web の分野にも手を出してみたい方、そういった方々に向けて、本書を執筆しました。

Python の文法や HTML、CSS の解説は極力行わず、Django フレームワークの解説にフォー
カスし、仕組みの部分であったり、なぜそういう書き方をするか、などもできるだけ説明する
ようにしました。Django を雰囲気で使えるようになったけど、もう少し仕組み的な部分も知りたい……といった方にも、ぜひ読んでいただきたいです。
また、初学者の方がよく疑問に思う部分や、よく起こるエラーを FAQ という形式で各節の最後にまとめています。こちらも、ぜひ目を通していただければと思います。

注意
Django フレームワーク 2.2 は、Python 3.5 以上で動作します。そのため、本書のサンプル
コードを試すには、Python.3.5 以上をお使いの PC にインストールする必要があります。

iii

目

次

目次

前書き............................................................................................................ iii

第1章
1.1
1.2

1.3

1.4

1.5

1.6

Django と Web と HTTP レスポンス..................... 1
概要.................................................................................................... 2
スタートプロジェクト...................................................................... 3
1.2.1

必要な作業の概要.................................................................... 3

1.2.2

Django のインストール............................................................ 3

1.2.3

Django プロジェクトの作成..................................................... 4

1.2.4

開発用サーバーの起動.............................................................. 7

Web の世界と Django について..................................................11
1.3.1

HTTP................................................................................... 11

1.3.2

Web サーバーのお仕事.......................................................... 15

1.3.3

Web フレームワークとは....................................................... 18

1.3.4

Django の特徴...................................................................... 18

Django アプリケーション.............................................................20
1.4.1

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

1.4.2

アプリケーションの登録........................................................ 22

1.4.3

はじめてのページ.................................................................. 24

URL ディスパッチャ......................................................................26
1.5.1

URL ディスパッチャとは....................................................... 26

1.5.2

urls.py の分割....................................................................... 28

1.5.3

URL ディスパッチャの仕組み................................................. 31

1.5.4

はじめての Django エラーページ............................................ 35

ビュー..............................................................................................36
1.6.1

ビューとは........................................................................... 36

1.6.2

ビューの置き場所.................................................................. 39

1.6.3

HTML を作ってみる.............................................................. 41

v

1.7

第2章

テンプレート...................................................................................43
1.7.1

テンプレートとは.................................................................. 43

1.7.2

テンプレートファイルへ変数を埋め込む.................................. 46

1.7.3

ショートカット関数 render.................................................... 47

1.7.4

共通テンプレートを作る........................................................ 49

1.7.5

URL のハードコーディングを無くす........................................ 53

1.7.6

テンプレートファイルの探索順序............................................ 55

1.7.7

テンプレートファイルの置き場所を追加する............................ 57

モデルと Django 管理サイト................................ 61

2.1

概要..................................................................................................62

2.2

データベース...................................................................................62

2.3

2.4

2.5

2.6

2.2.1

永続的なデータの保存............................................................ 62

2.2.2

データベースとは.................................................................. 63

モデル..............................................................................................65
2.3.1

モデルを作成する.................................................................. 66

2.3.2

モデルをデータベースに反映する............................................ 69

Django 管理サイト........................................................................70
2.4.1

Django 管理サイトとは.......................................................... 70

2.4.2

スーパーユーザーの作成........................................................ 70

2.4.3

Django 管理サイトを利用する................................................ 71

2.4.4

User モデルのフィールド....................................................... 78

モデルの一覧をテンプレートファイルへ渡す...............................81
2.5.1

Django 管理サイトの外でモデルを扱う................................... 81

2.5.2

一覧ビューの作成.................................................................. 81

2.5.3

モデルインスタンス............................................................... 84

2.5.4

テンプレートファイルでのメソッド呼び出し............................ 87

テンプレート内での __str__..........................................................89
2.6.1

2.7

リレーション...................................................................................96
2.7.1

vi

テンプレートフィルター........................................................ 90

リレーションとは.................................................................. 96

目 次

2.8

第3章

2.7.2

関連テーブルを作る............................................................... 97

2.7.3

Django での 1 対多................................................................ 97

マイグレーション............................................................................99
2.8.1

マイグレーションとは............................................................ 99

2.8.2

データベースを初期化する................................................... 104

2.8.3

カテゴリを設定する............................................................. 105

2.8.4

モデルフィールドを追加する................................................ 109

2.8.5

モデルフィールドを変更する................................................ 110

CRUD ..............................................................113

3.1

概要............................................................................................... 114

3.2

モデルの作成................................................................................ 115

3.3

3.4

3.5

3.2.1

Django アプリケーションを作成する..................................... 115

3.2.2

モデルを作成する................................................................ 116

3.2.3

データを追加してみる.......................................................... 120

口コミ一覧ページ......................................................................... 121
3.3.1

URL 定義の作成.................................................................. 121

3.3.2

ビューの作成...................................................................... 121

3.3.3

テンプレートファイルの作成................................................ 121

3.3.4

データの並び替え................................................................ 124

口コミ詳細ページ......................................................................... 125
3.4.1

URL 定義の作成.................................................................. 125

3.4.2

ビューの作成...................................................................... 126

3.4.3

URL に変数を埋め込む......................................................... 128

3.4.4

詳細ページのテンプレートファイル...................................... 132

3.4.5

更に洗練させた方法に.......................................................... 132

3.4.6

難しいと感じた人へ............................................................. 136

口コミの作成ページ..................................................................... 136
3.5.1

ビューの作成（完成形）........................................................ 136

3.5.2

データの送信チュートリアル（1）......................................... 137

3.5.3

データの送信チュートリアル（2）......................................... 140

3.5.4

GET と POST の違い........................................................... 143

vii

3.6

3.7

第4章

CSRF................................................................................. 145

3.5.6

データの送信チュートリアル（3）......................................... 147

3.5.7

データの送信チュートリアル（4）......................................... 149

3.5.8

データの送信チュートリアル（5）......................................... 154

3.5.9

データの送信チュートリアル（6）......................................... 156

口コミの更新ページ..................................................................... 160
3.6.1

URL 定義の作成.................................................................. 160

3.6.2

ビューの作成...................................................................... 160

3.6.3

テンプレートファイルでモデルインスタンスにアクセス.......... 162

口コミの削除ページ..................................................................... 164
3.7.1

URL 定義の作成.................................................................. 164

3.7.2

ビューの作成...................................................................... 164

3.7.3

テンプレートファイルの作成................................................ 165

クラスベース汎用ビュー ..................................... 167

4.1

概要............................................................................................... 168

4.2

関数ビューを書き換える.............................................................. 168

4.3

viii

3.5.5

4.2.1

generic.ListView................................................................. 168

4.2.2

generic.DetailView............................................................. 170

4.2.3

generic.CreateView............................................................ 170

4.2.4

generic.UpdateView........................................................... 174

4.2.5

generic.DeleteView............................................................ 175

クラスベース汎用ビューの仕組み............................................... 175
4.3.1

クラスベース汎用ビューのデメリット................................... 175

4.3.2

generic.View...................................................................... 177

4.3.3

generic.TemplateView........................................................ 181

4.3.4

generic.ListView................................................................. 184

4.3.5

generic.DetailView............................................................. 189

4.3.6

generic.FormView.............................................................. 191

4.3.7

generic.CreateView............................................................ 196

4.3.8

generic.UpdateView........................................................... 200

4.3.9

generic.DeleteView............................................................ 201

目 次

第5章

4.3.10as_view() に引数を渡す...................................................... 202

4.3.11

as_view() を views.py に書く.............................................. 204

4.3.12

実際のクラスベース汎用ビュー........................................... 204

フォームを使いこなす ........................................ 207

5.1

概要............................................................................................... 208

5.2

お問い合わせページ..................................................................... 208

5.3

5.4

第6章

5.2.1

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

5.2.2

お問い合わせ機能を作る...................................................... 210

5.2.3

フォームクラスの作り方...................................................... 213

5.2.4

フォームデータの受け取り方................................................ 215

5.2.5

メール送信処理................................................................... 217

フォームの表示まとめ................................................................. 222
5.3.1

form.as_p........................................................................... 222

5.3.2

form.as_table..................................................................... 223

5.3.3

form.as_ul.......................................................................... 224

5.3.4

for でフィールドを取り出す................................................. 225

5.3.5

手作業で取り出す................................................................ 231

フォームのカスタマイズ.............................................................. 232
5.4.1

ウィジェットの変更............................................................. 232

5.4.2

入力欄と選択欄に CSS の class を設定する............................. 242

5.4.3

通常のフォームとモデルフォームの違い................................ 245

静的ファイルとメディアファイル......................... 251

6.1

概要............................................................................................... 252

6.2

メディアファイルとは................................................................. 252
6.2.1

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

6.2.2

モデルの作成...................................................................... 252

6.2.3

動画一覧ページの作成.......................................................... 256

6.2.4

動画のアップロードページの作成.......................................... 259

ix

6.2.5

6.3

第7章

静的ファイルを利用する.............................................................. 263
6.3.1

静的ファイルとは................................................................ 263

6.3.2

静的ファイルを扱う............................................................. 263

6.3.3

静的ファイルの置き場所を変更する...................................... 267

ブログアプリケーションの作成 ............................ 269

7.1

概要............................................................................................... 270

7.2

モデルの作成................................................................................ 270
7.2.1

7.3

7.4

7.5

7.6

7.7

ブログのモデルを作成する................................................... 270

記事の一覧ページ......................................................................... 274
7.3.1

一覧ビューの作成................................................................ 274

7.3.2

テンプレートファイルの作成................................................ 275

記事の詳細ページ......................................................................... 277
7.4.1

詳細ビューの作成................................................................ 277

7.4.2

テンプレートファイルの作成................................................ 278

コメント機能................................................................................ 280
7.5.1

URL 定義の作成.................................................................. 280

7.5.2

フォームの作成................................................................... 280

7.5.3

ビューとテンプレートの作成................................................ 281

カテゴリタグ一覧の作成.............................................................. 290
7.6.1

x

動画の再生ページの作成...................................................... 261

方法 1 QuerySet を毎回渡す................................................. 290

7.6.2

方法 2 context_processors................................................... 292

7.6.3

方法 3 テンプレートタグの自作............................................ 293

7.6.4

カテゴリタグ一覧ビューの作成............................................. 295

検索フォームの作成..................................................................... 297
7.7.1

フォームクラス................................................................... 297

7.7.2

検索フォームを配置する...................................................... 300

7.7.3

検索処理の実装................................................................... 303

目 次

7.8

ページネーション......................................................................... 308
7.8.1

ページネーションとは.......................................................... 308

7.8.2

ListView のページネーション機能......................................... 309

7.8.3

他の GET パラメーターとの共存........................................... 311

索  引........................................................................................................ 317

xi

1

第

章

Django と Web とHTTP レスポンス

第1章

Django と Web と HTTP レスポンス

第1章

Django と Web と HTTP レスポンス

1.1 概要この章の目的は、ビューやテンプレート、URL ディスパッチャといった、Django の基本となる機能についての解説と、「Django のビューの目的は HTTP レスポンスを作成すること」という一文を理解できるようにすることです。例えば、関数タイプのビューでシンプルなページを表示するだけならば、次のようなコードになります。
def top(request):

return render(request, 'myprofile/top.html')

HTML の経験がある方や、Web 系の経験がある方ならば、なんとなく、HTML ページを表示するための処理なのかなと思うかもしれません。それは概ね間違いではありません。
この 2 行のコードには、沢山の情報が詰まっています。HTTP レスポンスを表現するオブジェクトを作り、レスポンスボディ部分をテンプレートファイルと呼ばれる雛形ファイルを利用して作成し、それを返却しています。
この動作をきちんと理解しようとすると、そもそもブラウザと Web サーバーがどういう風にやり取りをしているか、Django フレームワークはどこで動いているのか、この関数がどこから呼び出されているのか、そういった部分についても触れなければなりません。
難しいと思うかもしれませんが、この仕組みを理解しておくと大変捗ります。Django の理解にも繋がりますし、他の Web フレームワークを利用する際や、Web エンジニアとしても、有意義な知識となるでしょう。それに、順を追って見ていくと案外難しいものでもありま.
せん。
この章が終われば、簡単な Web サイトぐらいは作れるようになります。実際に、シンプルなプロフィールページを作りながら進めていきます。

2

1.2

1.2

スタートプロジェクト

1

スタートプロジェクト

2

1.2.1 必要な作業の概要

3

まずは Django を実際に動かして、ブラウザでページが表示されるまで進めます。この章の4

作業は、Django での開発を始める際に毎回行うことになります。折り目をつけたり栞を挟んでおきましょう。

5

Django で開発をするためには、いくつかの初期設定が必要です。先に作業内容の概要を紹介します。後で見返すときなどに利用してください。

6. 1.. Django をインストールします（まだの場合）。

7. 2.. 任意のディレクトリ（フォルダーのこと）を作成し、その中でパワーシェルやコマンド
プロンプト、ターミナルを開き、次のコマンドを実行します（表示されているウィンド
ウに対して、キーボードで次の文字列を入力します）。
django-admin startproject project .
python manage.py runserver. 3.. Django の設定ファイルである settings.py を開き、最後の方にある記述を次のように書き換えます。
LANGUAGE_CODE = 'ja'

# en-usからjaに変更

TIME_ZONE = 'Asia/Tokyo' # UTCからAsia/Tokyoに変更

これらの作業内容について、以降で詳しく説明します。

1.2.2 Django のインストール
Django は pip でインストールできます。
pip install django

3

第1章

Django と Web と HTTP レスポンス

書籍や Web サイトではインストールコマンドについて、上のように説明されることも多いです。しかし、これの意味するところは pip でインストールできるよというだけであって、コ
マンドをそのまま入力しなさいという意味ではありません。
上のコマンドは環境に合わせて書き換えてください。仮想環境を利用しているのか、グローバル環境に入れるのか、Windows なのか Mac なのか、そういった環境によって変わります。
「pip.install.django」のままで良いかもしれないし、Mac や Linux なら「python3.install.

django」、Windows ならば「py.-m.pip.install.django」かもしれません。Pipenv を使っていれば、「pipenv.install.django」になるでしょう。

1.2.3 Django プロジェクトの作成
無事にインストールできたら、さっそく Django プロジェクトを作成しましょう。

Django をインストールすると、django-admin というコマンドが利用できるようになります。
このコマンドを使って Django プロジェクトの作成が可能です。
プロジェクトを作成する前に、どこかにディレクトリを 1 つ作成してください。私はデスクトップに helloworld.com というディレクトリを作りました。

図2.1●私が作ったディレクトリ

ディレクトリの中でパワーシェルやターミナルを開き、次のコマンドを実行します。最後のピリオドを忘れないようにしてください。
django-admin startproject project .

仮想環境などを利用していなくて、Windows ユーザーであり、特に環境変数パスの追加もしていないならば、次のコマンドになるでしょう。

4

1.2

スタートプロジェクト

py -m django startproject project .

12

上のコマンドの結果、helloworld.com ディレクトリの中身は次のようになるはずです。

3
4
5
6
Django プロジェクトとは、Django で作る 1 つの Web サイト全体のことと思ってください。

7「django-admin.startproject」コマンドは、Django で作る Web サイトに必要なファイルやディレクトリを自動生成してくれるコマンドと言えます。
各ファイルやディレクトリについて簡単に説明します。

. ●. helloworld.com ディレクトリ
. . Django プロジェクトそのものです。もし、Django での開発中にエラーが出て、誰かに相談した際に「プロジェクトを見せて」と言われたら、helloworld.com ディレクトリを送付しましょう。

. ●. manage.py. . Django プロジェクトを管理するためのファイルです。開発用サーバーの起動をはじめ、さまざまな操作を提供しています。今後頻繁に利用します。

. ●. project ディレクトリ
. . Django プロジェクトの設定に関するディレクトリです。コマンド内の project 部分と同じ名前で作成されます。本書では、設定ディレクトリと今後呼びます。今回の例ならば、プロジェクト名が「helloworld.com」で、設定ディレクトリの名前が「project」ということです。

. ●. settings.py. . Django プロジェクトの設定に関するメインファイルです。日本語や英語など、言語の設定であったり、どの国のタイムゾーンで表示するかを設定したり、その他にも多くの設定

5

第1章

Django と Web と HTTP レスポンスがあります。こういった設定ファイルは .ini や .json、.yaml などのファイルを使うことも多いのですが、Python では 1 つの Python モジュールをそのまま設定ファイルとして利用することも多いです。

. ●. urls.py. . Web ページの URL と呼び出す処理を登録するファイルです。URLconf と呼ばれることもあるファイルで、この場所にある urls.py をルートの URLconf とも呼びます。本書では、
単純に urls.py と呼びます。どういった動作をするかは、1.5 節「URL ディスパッチャ」
で詳しく説明します。

. ●. wsgi.py. . 私たちが編集することは滅多にありません。Django の内部で利用される他、Web サイトを公開する際に意識することがある程度です。

. ●. __init__.py. . Python パッケージに必要なファイルです。存在を意識しなくて構いません。

FAQ
Q.「. django-admin.startproject.project」（ピリオドなし）ではダメですか。
A.. ピリオドをつけない場合、例えばデスクトップで実行したならば、デスクトップに projectというディレクトリが作られ、次のような中身になっています。

少しわかりにくいかもしれませんが、project ディレクトリの中に project ディレクトリがあり、その中に settings.py などが作成されます。つまりプロジェクト名（先ほどの例ならばhelloworld.com）とプロジェクトの設定ディレクトリ（先ほどの例なら project）が同じ名前で作成されるのです。

Django プロジェクトの名前は、「helloworld.com」のように実際に公開するドメイン名にすることが多いです。しかし、「django-admin.startproject.helloworld.com」のようにしてプ

6

1.2

スタートプロジェクト

ロジェクトを作成することはできません。コマンド内には、ピリオドやハイフンは使えないの.

1です。
「helloworld.com」のようなプロジェクト名にしたいならば、「django-admin.startproject.

2

project」（ピリオドなし）とした後にプロジェクト名だけリネームするか、今回行ったように
ディレクトリ、つまりプロジェクト名だけ先に作り、そこを Django プロジェクトにするかの

3

どちらかの方法になります。前者の方法だと、パワーシェルやターミナルでのコマンド操作が4

少し増えます。
プロジェクト名を自由に設定可能で、操作も多少シンプルになるため後者の方法で進めまし5

たが、そういった事情が気にならない方はピリオドなしの単純なコマンドでプロジェクトを作成してください。この方法でなければならないというものではありません。

6

Q..設定ディレクトリですが、「project」以外に使われる名前はありますか。

7

A.「. conf」や「config」も見かけます。startproject の標準の動作通り、プロジェクト名と設定ディ
レクトリ名を同一にする人も多くいます。プロジェクトを「narito.ninja」にして、設定ディレクトリの名前はピリオドやハイフンを抜いた「naritoninja」にしている例もありました。これも、この名前でなければならないというものではありません。本書では「project」という名前で進めます。
Q..設定ディレクトリの名前を変更したら動かなくなりました。
A.. プロジェクト名とは違い、設定ディレクトリの名前はいくつかのファイルの内部ですでに使われています。具体的には、settings.py に 2 か所、manage.py に 1 か所、wsgi.py に 1 か所です。それらの該当部分を新しい名前に書き換える必要があります。

1.2.4 開発用サーバーの起動
皆さんが普段使っている PC で Django で作ったものを確認できるように、Django には開発用サーバーが組み込まれています。次に示すのは、それを起動するためのコマンドです。
python manage.py runserver

インストールの時と同様に、Windows の方は次のようなコマンドになるかもしれません。

7

第1章

Django と Web と HTTP レスポンス

今後、本書で出てくるコマンドも同様に置き換えてください。
py manage.py runserver

開発用サーバーが無事に起動すると、コマンドプロンプトなどに次のように表示されます。
Watching for file changes with StatReloader
Performing system checks...

System check identified no issues (0 silenced).
October 05, 2019 - 11:07:36

Django version 2.2.4, using settings 'project.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CTRL-BREAK.

開発用サーバーを起動しないと、Django で作ったものをすぐに確認することができません。
そのため、Django で開発する際には毎回このコマンドを実行することになります。開発を中断したくなったり、疲れて寝たくなったら、コマンドプロンプトなどに表示されているとおり

Ctrl キーを押しながら Break キーを押すことで開発用サーバーを停止することができます。ただし、環境によって停止コマンドは変わります。Ctrl キーと C キーの場合もありますし、Mac
なら Ctrl キーの代わりに Command キーかもしれません。上の画面の最後に停止用のコマンドが表示されているので、それを確認しておきましょう。
ブラウザを開いて、URL 入力欄に http://127.0.0.1:8000/ と入れて、Enter キーを押しましょう。この「127.0.0.1:8000」は、自身の PC を指す少し特殊な URL です。次節であらためて説明します。
次のような画面になったら、上手く動いています。

8

1.2

スタートプロジェクト

1
2
3
4
5
6
7

図2.2●Djangoのようこそページ

これは Django プロジェクトの初期ページです。まだ何も設定していない Django プロジェ
クトでは、このようなページが表示されます。
あと少し作業が必要です。settings.py を開き、下側（一番下から探したほうが早いです）にある LANGUAGE_CODE と TIME_ZONE を書き換えてください。
LANGUAGE_CODE = 'ja'

# en-usからjaに変更

TIME_ZONE = 'Asia/Tokyo'# UTCからAsia/Tokyoに変更

LANGUAGE_CODE は、その Django プロジェクトをどの国の言語で表示するかを指定する変数です。ja は日本を意味します。

TIME_ZONE は、タイムゾーンの指定です。Asia/Tokyo は、日本における標準時を意味します。
これらを設定しないと、Django 内での表示時間がズレたり、さまざまなメッセージが英語で表示されてしまいます。注意してください。

Django プロジェクト内のファイルを変更すると、Django はファイルに変更があったことを自動で検知し、すべてのファイルをリロードします。settings.py を編集して保存したら、も

9

第1章

Django と Web と HTTP レスポンス

う一度 http://127.0.0.1:8000/ にアクセスしましょう。言語を日本語にしたので、初期ページも日本語になったはずです。

図2.3●初期ページも日本語に！

なお、自動リロードでは、ファイル追加のようないくつかの行動は検知されません。また、スペックによってはリロードされるまでの時間が長くなるかもしれません。エラーが出たり更新が反映されないときは、一度「manage.py.runserver」で開発用サーバーを再起動してください。それでも同様の現象が起これば、それは書いたコードで何らかのエラーになってい.
ます。

FAQ
Q.「
. UTC」とは何ですか。
A.. 協定世界時のことで、今の世界の基準となる時間のことです。Django のデフォルト設定では、この UTC が指定されています。UTC という用語は色々な場所で見かけるので、ぜひ覚えてください。
Q..runserver 時に、「UnicodeDecodeError:.'utf-8'.codec.can't.decode.byte」と表示されます。
A.. コンピューター名に日本語や記号が含まれている可能性があります。コンピューター名を
半角英数字のみに変更してください。

10