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

## `SingleObjectMixin`

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

提供一个查找与当前 HTTP 请求相关联的对象的机制。

方法和属性\*

#### `model`

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

#### `queryset`

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

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

#### `slug_field`

模型上包含 slug 的字段名称。默认情况下，`slug_field` 是 `'slug'`。

#### `slug_url_kwarg`

包含 slug 的 URLConf 关键字参数的名称。默认情况下，`slug_url_kwarg` 是 `'slug'`。

#### `pk_url_kwarg`

包含主键的 URLConf 关键字参数的名称，默认情况下，`pk_url_kwarg` 是 `'pk'`。

#### `context_object_name`

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

#### `query_pk_and_slug`

如果 `True`，使 [`get_object()`](#django.views.generic.detail.SingleObjectMixin.get_object) 使用主键和 slug 进行查找。默认值为 `False`。

这个属性可以帮助减轻 [不安全的直接对象引用](https://wiki.owasp.org/index.php/Top_10_2013-A4-Insecure_Direct_Object_References) 攻击。当应用程序允许通过顺序主键访问单个对象时，攻击者可以粗暴地强行猜测所有 URL，从而获得应用程序中所有对象的列表。如果应该阻止访问单个对象的用户获得这个列表，将 `query_pk_and_slug` 设置为 `True` 将有助于防止URL的猜测，因为每个 URL 需要两个正确的、非顺序的参数。使用唯一的 slug 可以达到同样的目的，但是这个方案允许你使用非唯一的 slug。

#### `get_object(queryset=None)`

返回该视图要显示的单个对象。如果提供了 `queryset`，将使用该查询集作为对象的来源；否则，将使用 [`get_queryset()`](#django.views.generic.detail.SingleObjectMixin.get_queryset)。`get_object()` 在视图的参数中寻找一个 [`pk_url_kwarg`](#django.views.generic.detail.SingleObjectMixin.pk_url_kwarg) 参数；如果找到这个参数，这个方法就使用这个值执行基于主键的查找。如果没有找到这个参数，则查找 [`slug_url_kwarg`](#django.views.generic.detail.SingleObjectMixin.slug_url_kwarg) 参数，并使用 :attr:slug\_field 执行 slug 查找。

当 [`query_pk_and_slug`](#django.views.generic.detail.SingleObjectMixin.query_pk_and_slug) 为 `True` 时，`get_object()` 将使用主键和 slug 进行查找。

#### `get_queryset()`

返回用于检索该视图将显示的对象的查询集。默认情况下， [`get_queryset()`](#django.views.generic.detail.SingleObjectMixin.get_queryset) 返回 [`queryset`](#django.views.generic.detail.SingleObjectMixin.queryset) 属性的值，如果它被设置，否则它通过调用 [`model`](#django.views.generic.detail.SingleObjectMixin.model) 属性的默认管理器上的 `all()` 方法来构造一个 `querySet`。

#### `get_context_object_name(obj)`

返回上下文变量名，该变量将用于包含该视图正在操作的数据。如果 [`context_object_name`](#django.views.generic.detail.SingleObjectMixin.context_object_name) 没有被设置，上下文名称将由查询集组成的模型的 `model_name` 构建。例如，模型 `Article` 的上下文对象将命名为 `'article'`。

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

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

该方法的基本实现要求视图设置 `self.object` 属性（即使 `None`）。如果你在使用这个混入时没有使用内置视图，请务必这样做。

它返回一个包含这些内容的字典：

- `object`：该视图显示的对象（`self.object`）。
- `context_object_name`：`self.object` 也将存储在 [`get_context_object_name()`](#django.views.generic.detail.SingleObjectMixin.get_context_object_name) 返回的名称下，默认为模型名称的小写版本。

> **上下文变量覆盖了模板上下文处理程序的值**
>
> 任何来自 [`get_context_data()`](#django.views.generic.detail.SingleObjectMixin.get_context_data) 的变量都优先于来自 [上下文处理器](/zh-hans/3.2/ref/templates/api/#subclassing-context-requestcontext) 的上下文变量。例如，如果你的视图将 [`model`](#django.views.generic.detail.SingleObjectMixin.model) 属性设置为 [`User`](/zh-hans/3.2/ref/contrib/auth/#django.contrib.auth.models.User)，那么默认的上下文对象名 `user` 将覆盖 [`django.contrib.auth.context_processors.auth()`](/zh-hans/3.2/ref/templates/api/#django.contrib.auth.context_processors.auth) 上下文处理器中的 `user` 变量。使用 [`get_context_object_name()`](#django.views.generic.detail.SingleObjectMixin.get_context_object_name) 来避免冲突。

#### `get_slug_field()`

返回一个 slug 字段的名称，用于通过 slug 查找。默认情况下，返回 [`slug_field`](#django.views.generic.detail.SingleObjectMixin.slug_field) 的值。

## `SingleObjectTemplateResponseMixin`

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

一个混入类，为对单个对象实例进行操作的视图执行基于模板的响应渲染。要求与之混合的视图提供 `self.object`，即该视图操作的对象实例。`self.object` 通常是，但不要求是 Django 模型的实例。如果视图正在构建一个新的实例，它可能是 `None`。

**扩展**

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

方法和属性\*

#### `template_name_field`

当前对象实例上的字段，可用于确定候选模板的名称。如果 `template_name_field` 本身或当前对象实例上的 `template_name_field` 的值为 `None`，则该对象不会被用于候选模板名称。

#### `template_name_suffix`

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

#### `get_template_names()`

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

- 视图中 `template_name` 的值（如果提供）
- 视图操作的对象实例上的 `template_name_field` 字段的内容（如果有的话）。
- `<app_label>/<model_name><template_name_suffix>.html`
