前回の記事のチュートリアルで、URLパターンに対応する簡単なビューを作成した。

【Django】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にアクセスしてみよう。

http://127.0.0.1:8000/polls/

上記のように、あらかじめ登録しておいた質問がリストで表示されていればOK。