Django入門: テンプレートの描画 ~ 簡単な一行掲示板アプリを作る その6【Windows10】
目次
はじめに
この記事はDjangoで簡単な1行掲示板を作ろうというシリーズ内の記事です。
前回までにDjangoでプロジェクトとアプリを作成し、アプリ(bbs
)をインストール後にプロジェクトのルート情報とアプリのルート情報を接続しました。
そしてアプリのルート情報からbbs
アプリのビューに接続し、「Hello, World!」を出力する所までやりました。
今回からbbs
アプリのビューからテンプレートファイルを描画してみたいと思います。
DjangoのMVTアーキテクチャのV(View)とT(Template)の部分です。
またOSはWindows10でシェルはコマンドプロンプトを使用します。
コマンドプロンプトは仮想環境をアクティベートしている前提です。
アクティベートしていない場合はvenv\Scripts\activate
を実行して仮想環境をアクティベートしてください。
仮想環境については第1回をご覧ください。
それから作業ディレクトリとしてmanage.py
のあるディレクトリに移動している前提です。
テンプレートの作成
manage.py
のあるディレクトリからbbs
ディレクトリの中身を見てみます。
> dir bbs admin.py # アプリの管理ページ apps.py # アプリの設定 migrations # マイグレーションファイル用のディレクトリ models.py # モデル tests.py # テスト urls.py # ルート情報 views.py # ビュー __init__.py # このディレクトリをモジュールとして認識させるためのファイル __pycache__ # Pythonのキャッシュ
前回はurls.py
とviews.py
を編集しました。
もう一度views.py
を見てみます。
from django.shortcuts import render from django.http import HttpResponse # <- この行を追加 def home_view(request): """ パス bbs/ のテンプレートを出力するビュー """ return HttpResponse('Hello, World!') # テスト。レスポンスを返す
↑のビュー(home_view
)は「Hello, World!」を出力するビューでした。
このビューを改造してテンプレートを描画します。
最初にテンプレートファイルを作成します。
テンプレートファイルはアプリ内のtemplates\
ディレクトリ以下に作成するのが慣例になっています。
このディレクトリはアプリの作成直後は自動で生成されたりはしていません。
開発者が自分でtemplates\
ディレクトリを作成し、テンプレートファイルを配置する必要があります。
manage.py
のあるディレクトリからbbs
ディレクトリに移動します。
> cd bbs
その後、template
ディレクトリを作成します。
> mkdir templates
templates
ディレクトリの中にはまた慣例なんですが、アプリ名のディレクトリを作成することが多いです。
この慣例に従わなくてもテンプレートファイルは配置できますが、今回はこの慣例に従うためにtemplates
以下にbbs
ディレクトリを作成します。
> mkdir templates\bbs
templates\bbs
ディレクトリを作成したらそのディレクトリ以下にhome.html
というHTMLファイルを作成します。
このファイルがDjangoの「テンプレート」ファイルで、home_view
から描画するテンプレートです。
これは一見するとただのHTMLファイルに見えますが、その中身はDjango独自のテンプレート言語で記述されます。
エディタでtemplates\bbs\home.html
を開き、↓のように編集します。
<h1>{{ message }}</h1>
Djangoのテンプレートファイル内ではDjangoのテンプレート言語の構文が使えます。
↑の場合<h1>
や</h1>
などはただのHTMLのタグですが、{{ message }}
という部分はテンプレート言語の構文です。
{{ }}
で囲い、その中に変数名を書くと、コンテキストの中の変数を参照し、出力することが出来ます。
コンテキストというのはビューからテンプレートファイルに渡される辞書(dict
)のことです。
このようにDjangoのテンプレートにはビューからコンテキストと呼ばれる辞書を渡すことが出来ます。
この辞書の中に変数を保存したりすることで、テンプレート内からビューの情報にアクセスすることが可能です。
ビューからテンプレートを描画する
ではビューに戻ります。
エディタでbbs
ディレクトリ以下のviews.py
を開き↓のように編集します。
from django.shortcuts import render def home_view(request): """ パス bbs/ のテンプレートを出力するビュー """ context = {} # コンテキストを作成 context['message'] = 'Hello, World!' # コンテキストにmessage変数を作成 return render(request, 'bbs/home.html', context) # renderにコンテキストを渡しテンプレートを描画
↑の冒頭でインポートしているrender()
は、ビューからテンプレートファイルを描画するための関数でした。
render()
の第1引数にはrequest
を渡し、第2引数にはテンプレートファイルのパス、第3引数にはコンテキストを渡します。
ビュー内の処理を見てみます。
context = {} # コンテキストを作成 context['message'] = 'Hello, World!' # コンテキストにmessage変数を作成
↑の部分はコンテキストを作成し、コンテキストの中にmessage
という変数を定義している所です。
これはただのPythonのdict
の操作で、特に難しいところは無いと思います。
次に↓の部分です。
return render(request, 'bbs/home.html', context) # renderにコンテキストを渡しテンプレートを描画
render()
に引数にはさきほど説明した引数を渡します。
繰り返しになりますが、第1引数にrequest
を渡し、第2引数にテンプレートファイルのパス、第3引数にコンテキストです。
テンプレートファイルのパスはアプリ内のtemplates
ディレクトリを起点に記述します。
↑の場合、パスがbbs/home.html
になっていますが、これはtemplates\bbs\home.html
を指しています。
render()
は返り値としてレスポンス(django.http.response.HttpResponse
)を返します。
ビューからこのrender()
の返り値を返すことで、あとはDjango(とWebサーバー)が描画をやってくれます。
これでビューによるテンプレートファイルの描画は完了です。
開発用サーバーで表示する
それではmanage.py
のあるディレクトリに移動して開発用サーバーを起動しましょう。
特にエラーがなければ↓のように表示されるはずです。
> python manage.py runserver 0.0.0.0:8123 Watching for file changes with StatReloader Performing system checks... System check identified no issues (0 silenced). You have 18 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth, contenttypes, sessions. Run 'python manage.py migrate' to apply them. September 20, 2020 - 10:30:28 Django version 3.1.1, using settings 'linebbs.settings' Starting development server at http://0.0.0.0:8123/ Quit the server with CTRL-BREAK.
http://localhost:8123/bbs
にアクセスすると↓のように表示されます。
無事にテンプレートファイルの描画が完了しました。
おわりに
今回はビューからrender()
を使ってテンプレートファイルを描画しました。
次回から一行掲示板の作成に入っていきたいと思います。
(^ _ ^) | おつかれさまでした |