---
title: "通用显示视图"
version: 6.1
locale: zh-hans
source: https://docs.djangoproject.com/zh-hans/6.1/ref/class-based-views/generic-display/
canonical: https://djangodocs.dev/zh-hans/6.1/ref/class-based-views/generic-display/
---
# 通用显示视图

以下两个基于类的通用视图旨在显示数据。在许多项目中，它们通常是最常用的视图。

## `DetailView`

#### `class django.views.generic.detail.DetailView`

当该视图执行时，`self.object` 将包含该视图正在操作的对象。

**祖先（MRO）**

该视图从以下视图继承方法和属性。

- [`django.views.generic.detail.SingleObjectTemplateResponseMixin`](/zh-hans/6.1/ref/class-based-views/mixins-single-object/#django.views.generic.detail.SingleObjectTemplateResponseMixin)
- [`django.views.generic.base.TemplateResponseMixin`](/zh-hans/6.1/ref/class-based-views/mixins-simple/#django.views.generic.base.TemplateResponseMixin)
- [`django.views.generic.detail.BaseDetailView`](#django.views.generic.detail.BaseDetailView)
- [`django.views.generic.detail.SingleObjectMixin`](/zh-hans/6.1/ref/class-based-views/mixins-single-object/#django.views.generic.detail.SingleObjectMixin)
- [`django.views.generic.base.View`](/zh-hans/6.1/ref/class-based-views/base/#django.views.generic.base.View)

**方法流程图**

1. [`setup()`](/zh-hans/6.1/ref/class-based-views/base/#django.views.generic.base.View.setup)
2. [`dispatch()`](/zh-hans/6.1/ref/class-based-views/base/#django.views.generic.base.View.dispatch)
3. [`http_method_not_allowed()`](/zh-hans/6.1/ref/class-based-views/base/#django.views.generic.base.View.http_method_not_allowed)
4. [`get_template_names()`](/zh-hans/6.1/ref/class-based-views/mixins-simple/#django.views.generic.base.TemplateResponseMixin.get_template_names)
5. [`get_slug_field()`](/zh-hans/6.1/ref/class-based-views/mixins-single-object/#django.views.generic.detail.SingleObjectMixin.get_slug_field)
6. [`get_queryset()`](/zh-hans/6.1/ref/class-based-views/mixins-single-object/#django.views.generic.detail.SingleObjectMixin.get_queryset)
7. [`get_object()`](/zh-hans/6.1/ref/class-based-views/mixins-single-object/#django.views.generic.detail.SingleObjectMixin.get_object)
8. [`get_context_object_name()`](/zh-hans/6.1/ref/class-based-views/mixins-single-object/#django.views.generic.detail.SingleObjectMixin.get_context_object_name)
9. [`get_context_data()`](/zh-hans/6.1/ref/class-based-views/mixins-single-object/#django.views.generic.detail.SingleObjectMixin.get_context_data)
10. [`get()`](#django.views.generic.detail.BaseDetailView.get)
11. [`render_to_response()`](/zh-hans/6.1/ref/class-based-views/mixins-simple/#django.views.generic.base.TemplateResponseMixin.render_to_response)

**示例 myapp/views.py**：

```
from django.utils import timezone
from django.views.generic.detail import DetailView

from articles.models import Article

class ArticleDetailView(DetailView):
    model = Article

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context["now"] = timezone.now()
        return context
```

**示例 myapp/urls.py**：

```
from django.urls import path

from article.views import ArticleDetailView

urlpatterns = [
    path("<slug:slug>/", ArticleDetailView.as_view(), name="article-detail"),
]
```

**示例 myapp/article\_detail.html**：

```html+django
<h1>{{ object.headline }}</h1>
<p>{{ object.content }}</p>
<p>Reporter: {{ object.reporter }}</p>
<p>Published: {{ object.pub_date|date }}</p>
<p>Date: {{ now|date }}</p>
```

#### `class django.views.generic.detail.BaseDetailView`

一个用于显示单个对象的基础视图。它不打算直接使用，而是作为 `django.view.generic.detail.DetailView` 或其他表示单个对象细节的视图的父类。

**祖先（MRO）**

该视图从以下视图继承方法和属性。

- [`django.views.generic.detail.SingleObjectMixin`](/zh-hans/6.1/ref/class-based-views/mixins-single-object/#django.views.generic.detail.SingleObjectMixin)
- [`django.views.generic.base.View`](/zh-hans/6.1/ref/class-based-views/base/#django.views.generic.base.View)

**方法**

#### `get(request, *args, **kwargs)`

将 `object` 添加到上下文中。

## `ListView`

#### `class django.views.generic.list.ListView`

一个表示对象列表的页面。

当该视图执行时，`self.object_list` 将包含该视图正在操作的对象列表（通常，但不一定是查询集）。

**祖先（MRO）**

该视图从以下视图继承方法和属性。

- [`django.views.generic.list.MultipleObjectTemplateResponseMixin`](/zh-hans/6.1/ref/class-based-views/mixins-multiple-object/#django.views.generic.list.MultipleObjectTemplateResponseMixin)
- [`django.views.generic.base.TemplateResponseMixin`](/zh-hans/6.1/ref/class-based-views/mixins-simple/#django.views.generic.base.TemplateResponseMixin)
- [`django.views.generic.list.BaseListView`](#django.views.generic.list.BaseListView)
- [`django.views.generic.list.MultipleObjectMixin`](/zh-hans/6.1/ref/class-based-views/mixins-multiple-object/#django.views.generic.list.MultipleObjectMixin)
- [`django.views.generic.base.View`](/zh-hans/6.1/ref/class-based-views/base/#django.views.generic.base.View)

**方法流程图**

1. [`setup()`](/zh-hans/6.1/ref/class-based-views/base/#django.views.generic.base.View.setup)
2. [`dispatch()`](/zh-hans/6.1/ref/class-based-views/base/#django.views.generic.base.View.dispatch)
3. [`http_method_not_allowed()`](/zh-hans/6.1/ref/class-based-views/base/#django.views.generic.base.View.http_method_not_allowed)
4. [`get_template_names()`](/zh-hans/6.1/ref/class-based-views/mixins-simple/#django.views.generic.base.TemplateResponseMixin.get_template_names)
5. [`get_queryset()`](/zh-hans/6.1/ref/class-based-views/mixins-multiple-object/#django.views.generic.list.MultipleObjectMixin.get_queryset)
6. [`get_context_object_name()`](/zh-hans/6.1/ref/class-based-views/mixins-multiple-object/#django.views.generic.list.MultipleObjectMixin.get_context_object_name)
7. [`get_context_data()`](/zh-hans/6.1/ref/class-based-views/mixins-multiple-object/#django.views.generic.list.MultipleObjectMixin.get_context_data)
8. [`get()`](#django.views.generic.list.BaseListView.get)
9. [`render_to_response()`](/zh-hans/6.1/ref/class-based-views/mixins-simple/#django.views.generic.base.TemplateResponseMixin.render_to_response)

**示例 views.py**：

```
from django.utils import timezone
from django.views.generic.list import ListView

from articles.models import Article

class ArticleListView(ListView):
    model = Article
    paginate_by = 100  # if pagination is desired

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context["now"] = timezone.now()
        return context
```

**示例 myapp/urls.py**：

```
from django.urls import path

from article.views import ArticleListView

urlpatterns = [
    path("", ArticleListView.as_view(), name="article-list"),
]
```

**示例 myapp/article\_list.html**：

```html+django
<h1>Articles</h1>
<ul>
{% for article in object_list %}
    <li>{{ article.pub_date|date }} - {{ article.headline }}</li>
{% empty %}
    <li>No articles yet.</li>
{% endfor %}
</ul>
```

如果你正在使用分页，可以使用 [来自分页文档的示例模板](/zh-hans/6.1/topics/pagination/#paginating-a-list-view) 进行适应。

#### `class django.views.generic.list.BaseListView`

一个用于显示对象列表的基础视图。它不打算直接使用，而是作为 `django.view.generic.list.ListView` 或其他代表对象列表的视图的父类。

**祖先（MRO）**

该视图从以下视图继承方法和属性。

- [`django.views.generic.list.MultipleObjectMixin`](/zh-hans/6.1/ref/class-based-views/mixins-multiple-object/#django.views.generic.list.MultipleObjectMixin)
- [`django.views.generic.base.View`](/zh-hans/6.1/ref/class-based-views/base/#django.views.generic.base.View)

**方法**

#### `get(request, *args, **kwargs)`

添加 `object_list` 到上下文。如果 [`allow_empty`](/zh-hans/6.1/ref/class-based-views/mixins-multiple-object/#django.views.generic.list.MultipleObjectMixin.allow_empty) 为 True，则显示一个空列表。如果 [`allow_empty`](/zh-hans/6.1/ref/class-based-views/mixins-multiple-object/#django.views.generic.list.MultipleObjectMixin.allow_empty) 为 False，则引发一个 404 错误。
