Django DetailView 显示父级属性
我正在尝试使用DetailView,但对它的理解还不够深入。
我想做的是根据一个对象的主键(pk)来显示它的属性。比如说,我在/notendur/34这个地址上,我想显示主键为34的对象的信息。
我在努力理解这个内容:
https://docs.djangoproject.com/en/dev/intro/tutorial04/
但是我看不太懂。也许你们中的某个人可以帮我理解一下?我在看那个链接中的第二个代码块,而不是第一个。
{% extends "index.html" %}
{% block content %}
{{ "placeholder" }}
{% endfor %}
{% endblock %}
我想用HTML从/notendur/34这个地址获取主键(pk)。
2 个回答
首先,在你的视图中需要加载合适的类:
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'),
...
)
通过在网址中定义slug参数,DetailView就知道你请求的是哪个项目的详细信息(你也可以使用pk,但slug会让网址更友好)。然后,它会根据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 }}
详细视图会自动把一个主键为 34
的对象传递到上下文中,这个对象的名字叫 object
。你可以在模板中访问这个对象,比如用 {{ object.pk }}
来获取它的主键,或者用 {{ object.some_property_name }}
来获取它的某个属性。