# Django 3.2.11.dev 文档

# 多对象混入

## `MultipleObjectMixin`

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

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

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

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

        path('objects/page<int:page>/', PaginatedView.as_view()),

  - 通过 `page` 查询字符串参数传递页码。例如，一个 URL 看起来像这样：

        /objects/?page=3

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

  更多关于分页的内容，请阅读 分页文档。

  作为一种特殊情况，你也可以使用 `last` 作为 `page` 的值：

      /objects/?page=last

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

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

  扩展

  - `django.views.generic.base.ContextMixin`

  **方法和属性*

  `allow_empty`

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

  `model`

    该视图将显示数据的模型。指定 `model = Foo` 实际上等于指定 `queryset = Foo.objects.all()`，其中 `objects` 代表 ``Foo``的 默认管理器。

  `queryset`

    代表对象的 `QuerySet`。如果提供，`queryset` 的值将取代为 `model` 提供的值。

    警告

    `queryset` 是一个类属性，它的值是 可变的，所以直接使用它时一定要注意。在使用它之前，要么调用它的 `all()` 方法，要么用 `get_queryset()` 检索它，它在幕后负责克隆。

  `ordering`

    一个字符串或字符串列表，指定应用于 `queryset` 的顺序。有效值与 `order_by()` 的值相同。

  `paginate_by`

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

  `paginate_orphans`

    一个整数，指定最后一页可以包含的”溢出“对象的数量。这扩展了 `paginate_by` 对最后一页的限制，最多可扩展到 `paginate_orphans`，以防止最后一页的对象数量非常少。

  `page_kwarg`

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

  `paginator_class`

    用于分页的 paginator 类。默认情况下，使用 `django.core.paginator.Paginator`。如果自定义的分页器类没有和 `django.core.paginator.Paginator` 一样的构造函数接口，你还需要为 `get_paginator()` 提供一个实现。

  `context_object_name`

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

  `get_queryset`()

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

  `get_ordering`()

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

    默认返回 `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` 的值。

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

    返回要用于该视图的分页器实例。默认情况下，实例化一个 `paginator_class` 的实例。

  `get_paginate_orphans`()

    一个整数，指定最后一页可以包含的”溢出“对象的数量。默认情况下，返回 `paginate_orphans` 的值。

  `get_allow_empty`()

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

  `get_context_object_name`(object_list)

    返回上下文变量名，该变量将用于包含该视图正在操作的数据列表。如果 `object_list` 是一个 Django 对象的查询集，并且 `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` 的实例。如果页面没有分页，这个上下文变量将是 `None`。
  - `page_obj`：一个 `django.core.paginator.Page` 的实例。如果页面没有被分页，这个上下文变量将是 `None`。

## `MultipleObjectTemplateResponseMixin`

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

  一个混入类，为对对象实例列表进行操作的视图执行基于模板的响应渲染。要求与之混入的视图提供 `self.object_list`，即该视图操作的对象实例列表。`self.object_list` 可以是，但不要求是： `QuerySet`。

  扩展

  - `TemplateResponseMixin`

  **方法和属性*

  `template_name_suffix`

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

  `get_template_names`()

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

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