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
变量添加到引用视图构造的实例的上下文中。