본문 바로가기
Library&Framework/Django

[django 기초][의문점] views.py에서 언제 as_view를 사용할까?

by 우지uz 2023. 4. 25.

의문은 여기서 들었다...

FBV(function based view)로 views.py를 url제어할 때는 

두번째 인자로, views.<함수이름> 을 받는 것을 확인할 수 있었는데

장고 실무 심화강의에서 부터 CBV(class based view)로 
views.py url제어에서는 

path 함수의 두번째 인자로, views.<클래스명>.as_view()를 인자로 받는 것을 확인할 수 있었다.

왜???? 저거 도대체 언제 붙혀야 하는건데? 라는 의문이 들었고
path 함수에 대해서 한번 검색해보고 알아본 경험이 있지만

다시한번 자세히 알아보기로 했다.

결론적으로, path 함수의 두번째 인자로는 
views.py에서 정의된 "함수"를 받는다. 
클래스가 아니라! 

자, 그러면 as_view는 함수일까??
궁금해서 커맨드+클릭 해보았다. 

@classmethod
    def as_view(cls, **initkwargs):
        """
        Store the original class on the view function.

        This allows us to discover information about the view when we do URL
        reverse lookups.  Used for breadcrumb generation.
        """
        if isinstance(getattr(cls, 'queryset', None), models.query.QuerySet):
            def force_evaluation():
                raise RuntimeError(
                    'Do not evaluate the `.queryset` attribute directly, '
                    'as the result will be cached and reused between requests. '
                    'Use `.all()` or call `.get_queryset()` instead.'
                )
            cls.queryset._fetch_all = force_evaluation

        view = super().as_view(**initkwargs)
        view.cls = cls
        view.initkwargs = initkwargs

        # Note: session based authentication is explicitly CSRF validated,
        # all other authentication is CSRF exempt.
        return csrf_exempt(view)

들어가보니, 함수라는 것을 알 수 있었다. 
맨위에 보면, 그냥 함수가 아닌
클래스 메소드! 

그래서, 결론적으로 

CBV기반의 URL 매핑을 할때에는 

path함수의 두번째 인자로
views.클래스.as_view()를 받는 다는 것을 알 수 있었습니다. !!