0

我正在尝试使用 DetailView。我对它没有深入的了解。

我想要做的是显示来自 pk 的对象的属性。也就是说,我在 /notendur/34,我想显示有关 pk=34 的对象的信息。

我试图理解这一点:

https://docs.djangoproject.com/en/dev/intro/tutorial04/

但我无法理解它。也许你们中的一个可以帮助我理解?我正在查看该链接中的第二个代码块,而不是第一个。

{% extends "index.html" %}
{% block content %}
{{ "placeholder" }}
{% endfor %}

{% endblock %}

例如,我希望使用 HTML 从 /notendur/34 获取 pk。

4

2 回答 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'),
    ...
)

通过在 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 }}
于 2014-06-06T14:32:52.943 回答
1

详细视图自动传递具有在上下文中34命名的主键的对象。object您可以在模板中访问它,例如{{ object.pk }}{{ object.some_property_name }}

于 2014-06-06T14:30:12.947 回答