해결된 질문
작성
·
617
0
안녕하세요.
django.views.generic.detail 에 있는 SingleObjectMixin의 메서드 get_context_data에는 self.object 가 있는데요.
class SingleObjectMixin(ContextMixin):
"""
Provide the ability to retrieve a single object for further manipulation.
"""
model = None
queryset = None
slug_field = 'slug'
context_object_name = None
slug_url_kwarg = 'slug'
pk_url_kwarg = 'pk'
query_pk_and_slug = False
...
생략
...
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)
이 속성은 어디에서 설정이 되어 있어서 이렇게 참조 할 수 있는 것일까요?
관련 코드도 다 뒤져보고, 검색도 해보았지만 전혀 단서를 찾을 수 없었습니다. 도움주시면 너무나 감사하겠습니다.
답변 1
1
self.object
는 SingleObjectMixin
에서 제공하는 기본 메서드들을 통해 설정됩니다.
SingleObjectMixin
은 단일 객체를 조회하고 화면에 렌더링하기 위한 공통된 기능을 제공하는 믹스인 클래스입니다. SingleObjectMixin
을 상속받은 뷰에서는 단일 객체를 조회하고, 이를 get_object()
메서드를 통해 반환합니다. 그리고 이렇게 반환된 객체는 self.object
에 저장됩니다.
따라서 get_context_data()
메서드에서 self.object
속성에 접근할 수 있는 것은, 이전에 get_object()
메서드를 통해 조회한 객체를 저장하고 있는 self.object
속성이 자동으로 설정되어 있기 때문입니다. get_object()
메서드에서 단일 객체를 조회한 후 self.object
에 저장되며, 이후 get_context_data()
에서 self.object
속성에 접근하면 조회한 단일 객체를 가져올 수 있습니다.
네, django.views.generic.detail
모듈의 SingleObjectMixin
클래스 소스 코드를 확인하면 get_object
메서드에서 단일 객체를 조회하고 이를 self.object
속성에 저장하는 것을 확인할 수 있습니다. 아래는 SingleObjectMixin
클래스에서 get_object
메서드 부분의 일부분입니다.
class SingleObjectMixin(ContextMixin):
"""
Provide the ability to retrieve a single object for further manipulation.
"""
# 생략
def get_object(self, queryset=None):
"""
Return the object the view is displaying.
Require `self.queryset` and a `pk` or `slug` argument in the URLconf.
Subclasses can override this to return any object.
"""
# 생략
# Get the single object from the queryset
obj = queryset.get()
# Store the object in the context
self.object = obj
return obj
# 생략
따라서 SingleObjectMixin
클래스를 상속받아 구현한 뷰에서 self.object
속성을 참조할 수 있는 것은, get_object
메서드를 통해 조회한 객체가 자동으로 self.object
에 저장되기 때문입니다.
답변 감사드립니다. 추가로 질문이 있는데, 말씀하신 대로 자동으로 설정되는
self.object
설정을 장고 소스코드에서도 확인할 수 있는 것일까요?