get_object返回的 Django 上下文


class ListDetailView(DetailView):
context_object_name = 'aaaa'
def get_object(self, queryset=None):
return List.objects.get(unique_list_id=self.kwargs['unique_list_id'])

在模板中,我有两个相等的上下文:

{{ object.list_name }}
{{ aaaa.list_name }}

如何覆盖 get_object(( 以仅返回context_object_name = 'aaaa'指定的上下文? 为什么我有 2 个上下文?

这不是由get_object方法[Django-doc]确定的,而是由DetailView[Django-doc]的get_context_data方法[Django-doc]的实现决定的。事实上,对于继承自SingleObjectMixin[Django-doc] 的视图,它是作为 [GitHub] 实现的:

def get_context_data(self, **kwargs):
"""Insert the single object into the context dict."""
context = {}
if self.object:
context['object'] = self.object
context_object_name = self.get_context_object_name(self.object)
if context_object_name:
context[context_object_name] = self.object
context.update(kwargs)
return super().get_context_data(**context)

因此,它将始终将对象设置为self.object(如果该对象存在(,如果有context_object_name,则也设置为该名称。

您可以通过将其从字典中删除来稍微更新它,例如:

class ListDetailView(DetailView):
context_object_name = 'aaaa'
def get_context_data(self, *args, **kwargs):
context = super().get_context_data(*args, **kwargs)
context.pop('object', None)
return context
def get_object(self, queryset=None):
return List.objects.get(unique_list_id=self.kwargs['unique_list_id'])

话虽如此,我认为删除它没有任何好处。它指的是同一个对象。查询不会执行两次:这是上下文中引用对象的两个名称。它使上下文更加统一,以便基本模板也可以处理object值。

请注意,即使删除了它,您仍然可以通过以下方式访问该对象:

{{view.object.list_name }}

由于get_context_name的基本实现会将view变量添加到引用视图构造的实例的上下文中。

最新更新