인프런 커뮤니티 질문&답변

코해님의 프로필 이미지
코해

작성한 질문수

장고(django) self.object 속성 관련

해결된 질문

작성

·

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.objectSingleObjectMixin에서 제공하는 기본 메서드들을 통해 설정됩니다.

SingleObjectMixin은 단일 객체를 조회하고 화면에 렌더링하기 위한 공통된 기능을 제공하는 믹스인 클래스입니다. SingleObjectMixin을 상속받은 뷰에서는 단일 객체를 조회하고, 이를 get_object() 메서드를 통해 반환합니다. 그리고 이렇게 반환된 객체는 self.object에 저장됩니다.

따라서 get_context_data() 메서드에서 self.object 속성에 접근할 수 있는 것은, 이전에 get_object() 메서드를 통해 조회한 객체를 저장하고 있는 self.object 속성이 자동으로 설정되어 있기 때문입니다. get_object() 메서드에서 단일 객체를 조회한 후 self.object에 저장되며, 이후 get_context_data()에서 self.object 속성에 접근하면 조회한 단일 객체를 가져올 수 있습니다.

코해님의 프로필 이미지
코해
질문자

답변 감사드립니다. 추가로 질문이 있는데, 말씀하신 대로 자동으로 설정되는 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에 저장되기 때문입니다.

코해님의 프로필 이미지
코해

작성한 질문수

질문하기