はじめに
最近、Django1.9を使っています。Django1.3からあるらしいのですが、再度view関係のクラスについてまとめておこうと思います。
Generic display views
今回はGeneric display viewについてです。ドキュメント読めばだいたい分かるんですけどね。
最小限で使ってみる
サンプルって色々書いてあるので、最小限だとどうなるのか書いてみました。Djangoのチュートリアルの1と2を終わらせた状態ではじめます。
view.py
まずはview.pyに最小限ListViewとDetailViewを継承したクラスを作ります。指定するのはmodelとtemplateのみです。
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を作ります。
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を持つデータが渡されています。
<!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>
<!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から見てみましょう。
1件しか表示されていないと有り難みが薄いのでDjangoAdminで1件追加します。
再度表示します。2件、表示されました。
次はDetailViewです。こちらは指定されたpkのデータが表示されています。pkの番号は登録順などで違いますので、DjangoAdminなどで確認してください。
http://127.0.0.1:8000/polls/1/
まとめ
一覧と詳細だけ表示したい場合はデータ型などにこだわらなければListViewとDetailViewで簡単に表示することができますね。
最後に
これは2015 tech-yuruyuru アドベントカレンダーの9日目の記事です。