まず、ビューで適切なクラスをロードする必要があります。
from django.views.generic import (
DetailView,
)
Class Based View Inspector によると (このリンクを参照してください):
http://ccbv.co.uk/
DetailView には次のプロパティがあります。
content_type = None
context_object_name = None
http_method_names = [u'get', u'post', u'put', u'patch', u'delete', u'head', u'options', u'trace'] View
model = None
pk_url_kwarg = 'pk'
queryset = None
response_class = <class 'django.template.response.TemplateResponse'>
slug_field = 'slug'
slug_url_kwarg = 'slug'
template_name = None
template_name_field = None
template_name_suffix = '_detail'
上記からわかるように、DetailView が呼び出されると、最初にリクエストに pk または slug 引数が存在するかどうかがチェックされます。これは urls.py ファイルで行われます。
urlpatterns = patterns('',
...
url(r'^view/(?P<slug>[\d]+)/$', MyTestDetailView.as_view(), name='myurl-name'),
...
)
URL で slug パラメーターを定義することにより、DetailView は、詳細を要求する項目を認識します (代わりに pk を使用できますが、slug はよりわかりやすい URL になります)。次に、slug または pk フィールドに基づいてモデルまたはクエリセット (ビューで定義) を取得します。これは def get_object(self, queryset=None) メソッドで実行されます。モデルを取得した後 (失敗すると 404 エラーが発生します)、テンプレート (template_name プロパティで指定) 内でオブジェクトを次のように使用できます。
{{ object }}
テンプレート変数の名前を変更する場合は、context_object_name プロパティを割り当てることができます。簡単な例は次のとおりです。
from django.views.generic import (
DetailView,
)
from myapp.models import (
MyModel,
)
class MyTestDetailView(DetailView):
"""
Set context object name to mytemplatevar
"""
context_object_name = "mytemplatevar"
"""
Define the model to use
"""
model = MyModel
"""
Define the template
"""
template_name = "myapp/detail_view.html"
他に何も必要ないことを除けば、テンプレートでオブジェクトにアクセスできます。
{{ mytemplatevar.something }}