More than 1 year has passed since last update.

 はじめに

最近、Django1.9を使っています。Django1.3からあるらしいのですが、再度view関係のクラスについてまとめておこうと思います。

Generic display views

今回はGeneric display viewについてです。ドキュメント読めばだいたい分かるんですけどね。

最小限で使ってみる

サンプルって色々書いてあるので、最小限だとどうなるのか書いてみました。Djangoのチュートリアルの12を終わらせた状態ではじめます。

view.py

まずはview.pyに最小限ListViewとDetailViewを継承したクラスを作ります。指定するのはmodelとtemplateのみです。

polls/veiw.py
from django.views.generic.detail import DetailView
from django.views.generic.list import ListView

from .models import Question


class IndexView(ListView):

    model = Question
    template_name = 'polls/index.html'

class DetailView(DetailView):

    model = Question
    template_name = 'polls/detail.html'

url.py

viewにクラスを作ったので、url.pyを作ります。

polls/url.py
from django.conf.urls import url

from . import views

app_name = 'polls'
urlpatterns = [
    url(r'^$', views.IndexView.as_view(), name='index'),
    url(r'^(?P<pk>[0-9]+)/$', views.DetailView.as_view(), name='detail'),
]

template

次はテンプレートを用意しましょう。

ListViewはmodelを指定するだけで、テンプレートにobject_listに指定したmodelのリストが渡されます。DetailViewの方はobjectに指定されたpkを持つデータが渡されています。

templates/polls/index.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Index</title>
</head>
<body>
Index
{% for object in object_list %}
    <h3>{{ object.question_text }}/ {{ object.pub_date }}</h3>
{% endfor %}
</body>
</html>
templates/polls/detail.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Detail</title>
</head>
<body>
Detail
<h1>{{ object.question_text }}</h1>
<h1>{{ object.pub_date }}</h1>
</body>
</html>

画面で見てみよう

ListViewから見てみましょう。

http://127.0.0.1:8000/polls/

index1.png

1件しか表示されていないと有り難みが薄いのでDjangoAdminで1件追加します。

admin.png

再度表示します。2件、表示されました。

index2.png

次はDetailViewです。こちらは指定されたpkのデータが表示されています。pkの番号は登録順などで違いますので、DjangoAdminなどで確認してください。

http://127.0.0.1:8000/polls/1/

detail.png

まとめ

一覧と詳細だけ表示したい場合はデータ型などにこだわらなければListViewとDetailViewで簡単に表示することができますね。

最後に

これは2015 tech-yuruyuru アドベントカレンダーの9日目の記事です。