기술블로그-Django편

📌 Django CBV에서 self.object, context['object'] 완전 정복하기

Chansman 2025. 5. 9. 16:55

📌 Django CBV에서 self.object, context['object'] 완전 정복하기


✅ 시작 질문: "왜 context['object'] = self.object 를 쓰는 거야?"

처음 사용자는 다음과 같은 질문에서 시작했습니다:

템플릿에서 댓글을 달 수 있게 되어 있는데, 버튼 누르면 어디서 어떤 처리가 일어나는지 헷갈려요.
self.object = self.get_object() 이건 왜 필요한 거고,
context['object'] = self.object는 도대체 어디 있는 건지도 모르겠어요.


1️⃣ 기본 구조 다시 보기

class BlogDetailView(DetailView):
    model = Blog
    template_name = 'blog_detail.html'

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['comment_form'] = CommentForm()
        return context
  • model = Blog: 이 뷰는 Blog 모델을 대상으로 작동함
  • template_name: 어떤 HTML 템플릿으로 그릴지 지정
  • get_context_data(): 템플릿에 넘길 데이터를 딕셔너리 형태로 구성

2️⃣ 사용자의 핵심 질문들

❓ self.object는 뭐고, 왜 변수에 담아줘?

  • self.object = self.get_object() 는 현재 보고 있는 블로그 글을 self.object 변수에 저장하는 거예요.
  • CBV 내부에서 get_context_data()나 render_to_response() 등에서 self.object를 자동으로 사용하기 때문에 필수로 지정해줘야 합니다.

❓ context['object'] = self.object 는 어디에 있는 거야?

  • 우리가 직접 안 쓰더라도, super().get_context_data() 안에서 Django가 자동으로 이렇게 해줍니다:
context['object'] = self.object
context['blog'] = self.object  # 모델명이 Blog일 경우

❓ 그럼 실제로 어떤 값이 들어가는 건데?

✅ 예제 코드: Blog 모델이 이렇게 생겼다고 해볼게요

# models.py
class Blog(models.Model):
    title = models.CharField(max_length=100)
    content = models.TextField()

✅ 예제 데이터 (DB에 저장된 값)

Blog.objects.create(id=3, title='장고 입문', content='클래스 기반 뷰를 배워봅시다')

✅ View가 /blog/3/ 요청을 받았을 때

self.object = self.get_object()
# 내부적으로는 아래처럼 동작해요:
self.object = Blog.objects.get(pk=3)

즉, self.object는 아래와 같은 Python 객체입니다:

<Blog: Blog object (3)>  # 실제로는 title, content 필드를 포함한 모델 인스턴스

✅ 그 다음 이 코드 실행

context['object'] = self.object

→ 실제로는 이렇게 저장되는 것과 같아요:

context = {
    'object': Blog(id=3, title='장고 입문', content='클래스 기반 뷰를 배워봅시다')
}

✅ 템플릿에서는 이렇게 씀

<h1>{{ object.title }}</h1>  <!-- 장고 입문 -->
<p>{{ object.content }}</p> <!-- 클래스 기반 뷰를 배워봅시다 -->

📌 정리

요소 실제 들어가는 값

self.object Blog 모델 객체 (Blog(id=3, title=..., content=...))
context['object'] 위 self.object와 동일한 객체
템플릿에서 {{ object.title }} "장고 입문" 출력됨

✅ 흐름 다시 요약

  1. self.object = self.get_object() → 현재 블로그 객체를 변수에 저장
  2. get_context_data() 호출 시 Django가 자동으로 context['object']에 담아줌
  3. 템플릿에서는 {{ object.필드 }} 형태로 꺼내 씀

💬 한 줄 결론

context['object']는 우리가 직접 안 써도, Django CBV가 템플릿에서 사용하기 쉽게 자동으로 self.object를 담아주는 키다!


이제 object가 추상적인 개념이 아니라, 진짜 Blog 인스턴스 객체가 들어있는 템플릿용 변수라는 게 정확히 보이시죠? 더 이상 헷갈릴 필요 없습니다 😄