首先,在您的视图中,您需要加载适当的类:
from django.views.generic import (
DetailView,
)
根据基于类的视图检查器(在此链接上保留参考):
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 }}