单对象混合 — Django 文档
单对象混合
SingleObjectMixin
- class django.views.generic.detail.SingleObjectMixin
提供一种查找与当前 HTTP 请求关联的对象的机制。
方法和属性
- model
此视图将为其显示数据的模型。 指定
model = Foo
与指定queryset = Foo.objects.all()
实际上相同,其中objects
代表Foo
的 默认管理器 。
- queryset
表示对象的
QuerySet
。 如果提供,queryset
的值将取代为 model 提供的值。警告
queryset
是一个具有 mutable 值的类属性,因此直接使用它时必须小心。 在使用它之前,要么调用它的 all() 方法,要么用 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() 使用主键和 slug 执行查找。 默认为False
。此属性可以帮助减轻 不安全的直接对象引用 攻击。 当应用程序允许通过顺序主键访问单个对象时,攻击者可以暴力猜测所有 URL; 从而获得应用程序中所有对象的列表。 如果应该阻止有权访问单个对象的用户获取此列表,将
query_pk_and_slug
设置为True
将有助于防止猜测 URL,因为每个 URL 都需要两个正确的、非连续的参数。 使用唯一的 slug 可以达到相同的目的,但这种方案允许您拥有非唯一的 slug。
- get_object(queryset=None)
返回此视图将显示的单个对象。 如果提供了
queryset
,则该查询集将用作对象的来源; 否则,将使用 get_queryset()。get_object()
在视图的参数中查找 pk_url_kwarg 参数; 如果找到此参数,则此方法使用该值执行基于主键的查找。 如果未找到此参数,则查找 slug_url_kwarg 参数,并使用 slug_field 执行 slug 查找。当 query_pk_and_slug 为
True
时,get_object()
将使用主键和 slug 执行查找。
- get_queryset()
返回将用于检索此视图将显示的对象的查询集。 默认情况下,get_queryset()如果设置了则返回queryset属性的值,否则通过调用
all()
构造一个QuerySet model 属性的默认管理器上的方法。
- get_context_object_name(obj)
返回将用于包含此视图正在处理的数据的上下文变量名称。 如果未设置 context_object_name,则上下文名称将根据构成查询集的模型的
model_name
构造。 例如,模型Article
将具有名为'article'
的上下文对象。
- get_context_data(**kwargs)
返回用于显示对象的上下文数据。
此方法的基本实现要求
self.object
属性由视图设置(即使None
)。 如果您在没有内置视图之一的情况下使用此 mixin,请务必执行此操作。它返回一个包含以下内容的字典:
object
:该视图显示的对象(self.object
)。context_object_name
:self.object
也将存储在 get_context_object_name() 返回的名称下,默认为模型名称的小写版本。
上下文变量覆盖来自模板上下文处理器的值
来自 get_context_data() 的任何变量优先于来自 上下文处理器 的上下文变量。 例如,如果您的视图将 model 属性设置为 User,则
user
的默认上下文对象名称将覆盖user
变量X170X]django.contrib.auth.context_processors.auth() 上下文处理器。 使用 get_context_object_name() 避免冲突。
- get_slug_field()
返回用于通过 slug 查找的 slug 字段的名称。 默认情况下,这将返回 slug_field 的值。
SingleObjectTemplateResponseMixin
- class django.views.generic.detail.SingleObjectTemplateResponseMixin
一个混合类,为在单个对象实例上操作的视图执行基于模板的响应呈现。 要求与它混合的视图提供
self.object
,即视图正在操作的对象实例。self.object
通常是,但不是必须是 Django 模型的实例。 如果视图正在构建新实例,则它可能是None
。扩展
方法和属性
- 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