Class View를 작성하다 보면 Template에게 context변수들을 전달하기 위해서 get_context_data()메소드를 오버라이딩 하여 사용한다. 그리고 주의할 점은 get_context_data()를 오버라이딩 한 후 super().get_context_data()를 꼭 작성해 주어야한다. 기본 타입은 아래와 같은 형태를 띄고 있다.
class TestView(TemplateView):
def get_context_data(self, **kwargs):
context = super().get_context_data()
return context
그렇다면 이 get_context_data()는 어떤 방식으로 작동하며 왜 super().get_context_data() 꼭 작성해 주어야하며 context를 반환할까? 우선 코드를 살펴보자. 우선 get_context_data()메소드는 django/views/generic/base.py 에 정의되어있다.
우선 오버라이딩 되지 않은 get_context_data메소드를 살펴보자. get_context_data 메소드의 parameter를 살펴보면, 인스턴스 자신을 가리키는 self와 (키워드)=(특정값)형태로 매개변수를 받는 kwargs가 있다. kwargs는 기본적으로 매개변수를 입력받으면 딕셔너리 타입으로 받게 된다. 그리고 setdefault메소드 같은 경우에는, 딕셔너리의 기본 메소드이다. setdefault같은 경우에는 두개의 매개변수를 받는다.
- param1 : 검사하고자 하는 Key값. 만약 Key가 존재하지 않는다면, 새로운 Key값으로 쌍을 생성한다.
- param2 : 만약 검사하고자 하는 Key에 대한 Value가 없는 경우, 설정할 value
위 코드에서는 "view"라는 키값을 가진 쌍의 Value가 self이면 유지하고, Value가 self와 일치하지 않는 경우 Key를 "view"로 하고, Value를 self로 설정한다는 의미가 된다.
그 다음 extra_context 클래스 변수를 재정의하였다면, 재정의한 extra_context의 변수값도 kwargs에 추가하는것을 볼 수 있다. update는 기존 딕셔너리에 새 딕셔너리의 요소들을 추가하는 내장 메소드이다. 그 후 kwargs를 반환하는것을 볼 수 있다.
위 코드에서는 우선적으로 context에 get_context_data()를 호출한 view 인스턴스 자기자신을 context에 등록하는 것이다. 이 과정을 거치는 이유는 예를 들어 TemplateView를 살펴보면
get_context_data를 통해 context값을 확정지은 다음 템플릿을 렌더링해 반환하는 render_to_response함수에 넘겨 템플릿을 완성시키는 방식으로 작동되는것을 볼 수 있다. render_to_response메소드는 결론적으로 context값이 필요로 하기 때문에, 클래스 뷰에서 get_context_data()메소드를 오버라이딩 한 후 context값을 return하는 것이다. render_to_response메소드는 아래에서 볼 수 있다.
결론적으로 지금까지의 과정을 해석해보면, 오버라이딩 하지 않은 상태로 그냥 template_name만 지정했을 경우에는 view인스턴스만 넘겨지고, 다른 컨텍스트는 저장할 수 없는것이다. 과정을 정리해보면 아래와 같은 과정으로 작동되는것을 알 수 있다.
- 클래스형 뷰에서 get_context_data()메소드 오버라이딩
- super().get_context_data() 를 실행하여, 기본적으로 view 인스턴스가 추가된, context를 반환받음
- 자신이 넣고자 하는 컨텍스트 코드 작성
- render_to_response함수를 위해 context 변수를 반환해준다.
글 초반에 던졌던 두가지 질문에 대한 답은 아래와 같이 서술할 수 있다.
- 왜 super().get_context_data()를 실행해야하는가? : 클래스형 view의 인스턴스를 context변수에 담기 위해서
- return context를 하는 이유는 무엇인가? : render_to_response에서 get_context_data()메소드로부터 context데이터를 받기 때문이다.
'Back-End > Python Django' 카테고리의 다른 글
[Django] DEBUG=False 상태에서 static 파일 사용하기 (0) | 2022.04.05 |
---|---|
[Django] 함수형 View 클래스형 View로 변경해보기 (0) | 2022.03.06 |
[Django] apps.py의 간단한 활용 (0) | 2022.03.05 |
[django] 클래스형 뷰 (0) | 2022.03.01 |
[Django] form클래스로 폼 생성하기 (0) | 2022.02.22 |