前回の記事のチュートリアルで、URLパターンに対応する簡単なビューを作成した。
今回は、別途用意するテンプレートを使ったビューの構築方法を取り上げる。
コンテンツ
データの取得
テンプレートを作成する前に、まずは表示するデータの取得をデータベースAPIを使っておこなう。
polls/views.pyのindexクラスを以下のように書き換えよう。
# 追加
from .models import Question
def index(request):
# 質問の最新5件を取得
latest_question_list = Question.objects.order_by('-pub_date')[:5]
テンプレートファイルの作成
取得したデータを受け取り、表示するためのテンプレートファイルを作成する。
ファイルの作成場所は次のとおり。
/mysite/polls/templates/polls/index.html
作成したindex.htmlテンプレートに次のコードを記述する。
{% if latest_question_list %}
<ul>
{% for question in latest_question_list %}
<li><a href="/polls/{{ question.id }}/">{{ question.question_text }}</a></li>
{% endfor %}
</ul>
{% else %}
<p>No polls are available.</p>
{% endif %}
Djangoのデフォルトの設定では、アプリのサブディレクトリ内からtemplatesフォルダを検索するようになっているため、フォルダ名は厳密さが求められる。
なお、この設定はプロジェクトルートのsettings.py内、TEMPLATESに詳細が書かれているので一度確認してみると良いだろう。
ビューからテンプレートファイルを呼び出す
最後にpolls/views.pyのindexクラスを以下のように書き換え、テンプレートファイルを呼び出す。
from .models import Question
def index(request):
latest_question_list = Question.objects.order_by('-pub_date')[:5]
context = {
'latest_question_list': latest_question_list,
}
return render(request, 'polls/index.html', context)
最後のrender関数では、第一引数にrequestオブジェクトを、第二引数にテンプレートファイルパスを、第三引数(任意)にテンプレートに渡すデータを指定する。
開発サーバーで確認
それでは、python manage.py runserverコマンドを実行し、以下のURLにアクセスしてみよう。
上記のように、あらかじめ登録しておいた質問がリストで表示されていればOK。