ショートカットよりもさらに短くページを作れるのが汎用ビュー。
http://docs.djangoproject.jp/en/latest/ref/generic-views.html
今までviews.pyにいろいろと書いてきたが、汎用ビューを使えばそれをごっそり削ることができる。
アプリケーション側のurls.pyを以下のように編集。
polls/urls.py
from django.conf.urls import patterns, include, url
from django.views.generic import DetailView, ListView
from polls.models import Poll
urlpatterns = patterns('', # 空の状態に戻すのを忘れずに
url(r'^$',
ListView.as_view(
queryset=Poll.objects.order_by('-pub_date')[:5],
context_object_name='latest_poll_list',
template_name='polls/index.html'
)
),
url(r'^(?P<pk>\d+)/$',
DetailView.as_view(
model=Poll,
template_name='polls/detail.html'
)
),
url(r'^(?P<pk>\d+)/results/$',
DetailView.as_view(
model=Poll,
template_name='polls/results.html'
),
name='poll_results'
),
url(r'^(?P<poll_id>\d+)/vote/$', 'polls.views.vote'),
)
ここではListViewとDetailViewとが出てきている。
まず共通の点でいうと、これまではviews.py側で
# def index..
temp = loader.get_template('polls/index.html')
とか
return render_to_response('polls/detail.html',{ #..
という風に関数内でテンプレートを指定していたのを、
# url(..
# SomeView.as_view(..
template_name = 'polls/index.html'
の一文で代替。URLconf内でそれぞれのテンプレートを直接指定している。
ここを指定しなかった場合は’appName/modelName_detail.html’というものがデフォルト名になるらしいが、このファイル名でテンプレートを作るのは今いち。特に今回の例ではdetailとresultsでテンプレート名がカブってしまうので絶対によろしくない。
次に汎用ビューの種類ごとに見てみる。
まずはListView。
queryset:リストで表示したいデータを入れる(配列)。
context_object_name:querysetの名前を指定(指定しなければmodelName_listという名前がデフォルト)。前回までに作ったテンプレートでは受け取る名前が’latest_poll_list’だったためこれに変更(テンプレート側の名前を編集しても結果は同じ)。
DetailView。
最初に、urlの第一引数が微妙に変わっているところに注目。
# before
r'^(?P<poll_id>\d+)/$'
# after
r'^(?P<pk>\d+)/$'
‘\d+’(一桁以上の数字)をpk(PrimaryKey)としたデータがテンプレートに反映される。ここでのpkは決まり文句。slugというのもあるらしいが現状ではよく分からない。
model:そのままだがモデルクラスを指定している。
name:ビューに名前を設定している。このビューを呼び出すようなURLを自動生成できるらしい(名前付きパターン?)。
URLconfの編集はこれにて終了。そしてここまでやったのであれば、
views.pyのindex,detail,results関数はもう要らない。
消してしまっても大丈夫。ただしvoteだけは残しておこう。
そして以下のように一行だけ編集。
views.py
#def vote..
return HttpResponseRedirect( reverse('poll_results', args=(pobject.id,)) )
reverseの第一引数が'polls.views.results’から’poll_results’に変更されている。
これは先ほど設定したresultsページのnameで、reverseはここからビューに応じたURLを自動生成してくれるみたい。
以上で汎用ビューへの乗り換えは完了。
動作確認をすると、前回とまったく同じ動作をすることが確認できる。
明らかにこっちのほうが楽。
ついでにチュートリアルもこれにて終了。
さしあたっては過去の投稿DJangoメモ:ブログ作成の基礎を参考にしていた本と一緒に見直してみて、同時にやり直してもいきたい。