---
title: "多对象混入"
version: 6.1
locale: zh-hans
source: https://docs.djangoproject.com/zh-hans/6.1/ref/class-based-views/mixins-multiple-object/
canonical: https://djangodocs.dev/zh-hans/6.1/ref/class-based-views/mixins-multiple-object/
---
# 多对象混入

## `MultipleObjectMixin`

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

一个可以用来显示对象列表的混入。

如果指定了 `paginate_by`，Django 会对返回的结果进行分页。你可以用两种方式之一在 URL 中指定页码。

- 在 URLconf 中使用 `page` 参数。例如，你的 URLconf 可能是这样的：

  ```
  path("objects/page<int:page>/", PaginatedView.as_view()),
  ```
- 通过 `page` 查询字符串参数传递页码。例如，URL 可以如下所示：

  ```text
  /objects/?page=3
  ```

这些数值和列表是以 1 为基础的，而不是以 0 为基础的，所以第一页将表示为 `1` 页。

更多关于分页的内容，请阅读 [分页文档](/zh-hans/6.1/topics/pagination/)。

作为特殊情况，你也可以将 `page` 的值设为 `last`：

```text
/objects/?page=last
```

这允许你访问结果的最后一页，而不必首先确定有多少页。

请注意，`page` *必须* 是有效的页码或 `last` 值；`page` 的任何其他值将导致 404 错误。

**扩展**

- [`django.views.generic.base.ContextMixin`](/zh-hans/6.1/ref/class-based-views/mixins-simple/#django.views.generic.base.ContextMixin)

**方法和属性**

#### `allow_empty`

一个布尔值，用于指定是否在没有对象的情况下显示页面。如果这个值是 `False`，并且没有可用的对象，视图将提出一个 404，而不是显示一个空的页面。默认情况下，这是 `True`。

#### `model`

该视图将显示数据的模型。指定 `model = Foo` 实际上等于指定 `queryset = Foo.objects.all()`，其中 `objects` 代表 `Foo` 的 [默认管理器](/zh-hans/6.1/topics/db/managers/#default-managers)。

#### `queryset`

代表对象的 `QuerySet`。如果提供，`queryset` 的值将取代为 [`model`](#django.views.generic.list.MultipleObjectMixin.model) 提供的值。

> **Warning**
>
> `queryset` 是一个类属性，它的值是 *可变的*，所以直接使用它时一定要注意。在使用它之前，要么调用它的 [`all()`](/zh-hans/6.1/ref/models/querysets/#django.db.models.query.QuerySet.all) 方法，要么用 [`get_queryset()`](#django.views.generic.list.MultipleObjectMixin.get_queryset) 检索它，它在幕后负责克隆。

#### `ordering`

一个字符串或字符串列表，指定应用于 `queryset` 的顺序。有效值与 [`order_by()`](/zh-hans/6.1/ref/models/querysets/#django.db.models.query.QuerySet.order_by) 的值相同。

#### `paginate_by`

一个整数，指定每页应显示多少对象。如果给定了这个值，视图将用 `paginate_by` 对象分页。视图将期待一个 `page` 查询字符串参数（通过 `request.GET`）或一个在 URLconf 中指定的 `page` 变量。

#### `paginate_orphans`

一个整数，指定最后一页可以包含的”溢出“对象的数量。这扩展了 [`paginate_by`](#django.views.generic.list.MultipleObjectMixin.paginate_by) 对最后一页的限制，最多可扩展到 `paginate_orphans`，以防止最后一页的对象数量非常少。

#### `page_kwarg`

一个字符串，用于指定页面参数的名称。视图希望该参数可以作为查询字符串参数（通过 `request.GET`）或作为 URLconf 中指定的 kwarg 变量。默认为 `page`。

#### `paginator_class`

用于分页的 paginator 类。默认情况下，使用 [`django.core.paginator.Paginator`](/zh-hans/6.1/ref/paginator/#django.core.paginator.Paginator)。如果自定义的分页器类没有和 [`django.core.paginator.Paginator`](/zh-hans/6.1/ref/paginator/#django.core.paginator.Paginator) 一样的构造函数接口，你还需要为 [`get_paginator()`](#django.views.generic.list.MultipleObjectMixin.get_paginator) 提供一个实现。

#### `context_object_name`

指定在上下文中使用的变量名称。

#### `get_queryset()`

获取此视图的项目列表。这必须是一个可迭代对象，也可以是一个查询集（查询集特定行为将被启用）。

#### `get_ordering()`

返回定义应用于 `queryset` 的排序的字符串（或字符串的迭代）。

默认返回 [`ordering`](#django.views.generic.list.MultipleObjectMixin.ordering)。

#### `paginate_queryset(queryset, page_size)`

返回一个包含 (`paginator`, `page`, `object_list`, `is_paginated`) 的四元元组。

通过将 `queryset` 分页成大小为 `page_size` 的页面来构建。如果请求中包含一个 `page` 参数，无论是作为一个捕获的 URL 参数还是作为一个 GET 参数，`object_list` 将对应于该页的对象。

#### `get_paginate_by(queryset)`

返回要分页的项目数，如果没有分页，则返回 `None`。默认情况下，返回 [`paginate_by`](#django.views.generic.list.MultipleObjectMixin.paginate_by) 的值。

#### `get_paginator(queryset, per_page, orphans=0, allow_empty_first_page=True)`

返回要用于该视图的分页器实例。默认情况下，实例化一个 [`paginator_class`](#django.views.generic.list.MultipleObjectMixin.paginator_class) 的实例。

#### `get_paginate_orphans()`

一个整数，指定最后一页可以包含的”溢出“对象的数量。默认情况下，返回 [`paginate_orphans`](#django.views.generic.list.MultipleObjectMixin.paginate_orphans) 的值。

#### `get_allow_empty()`

返回一个布尔值，指定是否在没有对象的情况下显示页面。如果本方法返回 `False`，并且没有可用的对象，视图将引发 404，而不是显示一个空页面。默认情况下，这个方法是 `True`。

#### `get_context_object_name(object_list)`

返回上下文变量名，该变量将用于包含该视图正在操作的数据列表。如果 `object_list` 是一个 Django 对象的查询集，并且 [`context_object_name`](#django.views.generic.list.MultipleObjectMixin.context_object_name) 没有被设置，那么上下文名称将是该查询集组成的模型的 `model_name`，并加上后缀 `'_list'`。例如，模型 `Article` 将有一个名为 `article_list` 的上下文对象。

#### `get_context_data(**kwargs)`

返回用于显示对象列表的上下文数据。

**上下文**

- `object_list`：该视图正在显示的对象列表。如果指定了 `context_object_name`，该变量也将在上下文中设置，其值与 `object_list` 相同。
- `is_paginated`：一个布尔值，表示结果是否分页。具体来说，如果没有指定页面大小，或者如果可用的对象没有跨越多个页面，则设置为 `False`。
- `paginator`：一个 [`django.core.paginator.Paginator`](/zh-hans/6.1/ref/paginator/#django.core.paginator.Paginator) 的实例。如果页面没有分页，这个上下文变量将是 `None`。
- `page_obj`：一个 [`django.core.paginator.Page`](/zh-hans/6.1/ref/paginator/#django.core.paginator.Page) 的实例。如果页面没有被分页，这个上下文变量将是 `None`。

## `MultipleObjectTemplateResponseMixin`

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

一个混入类，为对对象实例列表进行操作的视图执行基于模板的响应渲染。要求与之混入的视图提供 `self.object_list`，即该视图操作的对象实例列表。`self.object_list` 可以是，但不要求是： [`QuerySet`](/zh-hans/6.1/ref/models/querysets/#django.db.models.query.QuerySet)。

**扩展**

- [`TemplateResponseMixin`](/zh-hans/6.1/ref/class-based-views/mixins-simple/#django.views.generic.base.TemplateResponseMixin)

**方法和属性**

#### `template_name_suffix`

自动生成的候选模板名称的后缀。默认后缀是 `_list`。

#### `get_template_names()`

返回候选模板名称的列表。返回以下列表：

- 视图中 `template_name` 的值（如果提供）
- `<app_label>/<model_name><template_name_suffix>.html`
