Django DetailView 显示父级属性

0 投票
2 回答
706 浏览
提问于 2025-04-18 08:52

我正在尝试使用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 个回答

1

首先,在你的视图中需要加载合适的类:

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 }}
1

详细视图会自动把一个主键为 34 的对象传递到上下文中,这个对象的名字叫 object。你可以在模板中访问这个对象,比如用 {{ object.pk }} 来获取它的主键,或者用 {{ object.some_property_name }} 来获取它的某个属性。

撰写回答