前回はここ
環境
- macOS High Sierra version 10.13.3
- Python 3.6.3
- Django 2.0.1
テーマ
今回のテーマは、「ページを表示する」です。
とにかくページを表示できるようになることが目標。
urls.py
今回の主役1号です。
プロジェクトの方
まずはプロジェクトの方のurls.pyを以下のように変更します。
from django.contrib import admin
from django.urls import path, include # includeを追加
urlpatterns = [
path('admin/', admin.site.urls),
path('', include('todo.urls')), # ここも追加
]
これは何をしているかというと、todoアプリのurls.pyを読み込んでねっていうお願いの宣言です。
この辺は本家にもあると思うので、さらっと。
さて、次はアプリの方のurls.pyに行きたいところですが、先にviewを書いちゃいましょう。
Views.py
todo/views.py ですね。
主役2号です。
以下のようにします。
from django.shortcuts import render
# Create your views here.
# 以下追加部分
def index(request):
hello = "Hello, World"
context = {
'hello': hello,
}
return render(request, 'todo/index.html', context)
viewは表示するデータを渡してレンダリングする役割を果たします。
view関数を定義する他、クラスベースビューを使う方法もありますが、それはまた後ほど。
ビュー関数は引数に必ずrequest
をとります。ここに渡される内容はHTTPリクエストですね。
レンダリングする方法はいくつかありますが、一番簡単且つ、後々応用が効く方法だと勝手に思っているのが、コンテキストを定義して、リクエストと一緒にrender()
関数へ渡しちゃう方法です。
コンテキスト
コンテキストとはテンプレートへデータを渡すためのデータ辞書ですね。(たぶん)
keyの部分には、テンプレート上で使用する文字を、valueの部分には実際に渡すデータを。
ここでは、hello
という変数に"Hello, World"
という文字列を格納して、それをコンテキストへ渡してます。
つまり、テンプレート上で{{ hello }}
とすば、"Hello, World"の文字がレンダリングされるという事です。
render()
render()関数へ渡している引数は順に以下の通りです。
第1引数:request。 HTTPリクエストが渡されている。
第2引数:どのテンプレートを使うかを指定。index.html
はあとで作ります。
第3引数:コンテキスト。直接辞書を書くことも可能ですが、分かりにくいので、辞書型の変数を渡す派です。
index.html
view関数の定義が完了したので、先ほど指定したテンプレートを用意しましょう。
project/todo/templates/todo/index.html
こんな感じですね。
テンプレートは、djangoが自動的にtemplates
以下を探してくれるのですが、アプリが複数になった時、index.html
とか被りやすい名前の判別に困ってしまうようです。
なので、今はあまり意味のないことですが、todo/temolates/todo/index.html
という複雑な階層で用意しましょう。
内容
とりあえずindex.htmlの中身ですが、{{ hello }}
でいいと思います。
波括弧で囲うのはjinja2の表記ですね。
{{ hello }}
本当にこれしか書いてません。抜粋ではないです。
またまた、urls.py
最後にアプリ側のurls.pyを書きましょう。
アプリ内にはもともとurls.pyはないので、新たに作る必要があります。
内容はこんな感じ。
from django.urls import path
from todo import views
urlpatterns = [
path('', views.index, name='index')
]
プロジェクトの方のurls.pyと似たようなものですね。
違いといえば、アプリのviewsをインポートしてます。
views.pyの中のindex関数を見てねということでしょうか。
name=index
の部分ですが、これは追い追いテンプレートで役立つので、書いとくと良いです。
まぁ、ちょっと表記が省略できる程度ですが、可読性も上がるし書くべきだと思います。
いざ、runserver
$ python manage.py runserver
で開発用のローカルサーバーが立ち上がるので、コマンドを打って、ブラウザで確認しましょう。
まとめ
ポイントは、views.pyでコンテキストをセットして、render()関数へ渡すことと、urls.pyでその関数を指定してあげることだと思います。
この基本の繰り返しで好きなURLから好きなページをレンダリング=表示させることができると思います。
以上です。