LoginSignup
16
13

More than 5 years have passed since last update.

DJangoメモ:はじめから(汎用ビューの使用)

Last updated at Posted at 2013-12-20

ショートカットよりもさらに短くページを作れるのが汎用ビュー。
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メモ:ブログ作成の基礎を参考にしていた本と一緒に見直してみて、同時にやり直してもいきたい。

そして、それをherokuで公開するのが次の目標。

16
13
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
16
13