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

커리30님의 프로필 이미지

작성한 질문수

파이썬/장고로 결제 시작하기 (Feat. 아임포트) - 기본편

장바구니 담기 뷰 강의에서 질문이 있습니다.

해결된 질문

23.05.09 22:01 작성

·

376

0

  1. 장바구니 담기 뷰를 듣기 전까지 ProductListView에서 쿼리셋을 호출하는 변수는 아래와 같이 작성하고 있었습니다. -> 계속 이 쿼리를 참조하고 있다고 생각했습니다.

    product_qs = Product.objects.all().select_related(
        "category"
    )
  1. product_list.html에서는 해당 쿼리를 {% for product in product_list %}으로 불러오고 있는데 여기서 쿼리셋의 이름이 되는 product_list가 어떻게 저 이름을 가지게 되는건지 앞 강의에서 설명해 주신것 같은데 맞을까요? 다시 들으려고 했는데 강의가 많아 혹시 어떤 회차인지 알려주시면 감사하겠습니다 ..ㅠ.ㅠ(뷰에서는 따로 객체 이름을 지정해서 전달하지 않아서요)

     

  2. status=ACTIVE인 쿼리만 불러오기 위해 product_qs에 filter를 걸었더니 전체 목록이 나오더라구요. 그럼 제가 그동안 참고하고 있던(화면에 리스트가 보여지는)것은 ProductListView에서 어떤 쿼리셋을 참고하고 있던 것인가요?

    product_qs = Product.objects.filter(status=Product.Status.ACTIVE).select_related(
        "category"
    )
  1. product_qs 변수명을 queryset으로 변경하니 필터로 걸러진 목록이 잘 나왔습니다. 그렇다면 제가 변수명을 틀리게 작성하고 있었다는 것인데 어떻게 보여진 것일까요?(3번과 맥락이 비슷합니다!)

답변 1

1

이진석님의 프로필 이미지
이진석
지식공유자

2023. 05. 09. 23:54

안녕하세요.

장고의 CBV인 ListView에서는 ListView의 디폴트 설정으로
템플릿에서는 모델명소문자_list 이름으로 쿼리셋 객체를 참조할 수 있습니다.
혹은 object_list 이라는 이름도 지원합니다.

CBV에서 model=Product 클래스 변수 선언이 있었다면, product_list 이름이나 object_list 이름을 지원하구요.
model=Post 클래스 변수 선언이 있었다면, post_list 이름이나 object_list 이름을 지원합니다.

CBV에 context_object_name 설정을 통해 커스텀 이름을 지정할 수도 있습니다.

관련 장고 코드 : https://github.com/django/django/blob/4.2/django/views/generic/list.py#L117

이 부분은 장고 기초 내용이고, 본 강의는 아임포트와의 연동에 포커스를 두고 있어서
CBV에 대한 자세한 설명을 하진 않습니다. CBV를 비롯한 장고 기초에 대해서는
다른 강의 "파이썬/장고 웹서비스 개발 완벽 가이드 with 리액트"에서 다루고 있습니다.

---

image

위 클래스에서 model과 queryset은 클래스 변수입니다. 어딘가에서 이 값을 참조하는 로직이 있어야 의미가 있습니다.
ListView 클래스에서는 model과 queryset 이름의 클래스 변수가 있다면 참조하는 로직이 있습니다. 약속인거죠.

ListView에 model과 queryset 등의 클래스 변수에 대한 디폴트 설정이 있고,
우리가 정의하는 ListView를 상속받은 클래스에서는 필요하다면, 기존 클래스 변수에 대한 재정의(override)를 하는 것입니다.

아래와 같이 product_qs 이름의 클래스 변수를 선언하셨다면,

image

ListView 클래스 내에서 product_qs 클래스 변수를 참조하는 로직이 없기 때문에, product_qs 클래스 변수는 아무런 역할을 하지 않습니다.

구현하신 ProductListView 클래스에서 product_qs 클래스 변수를 참조하는 로직을 직접 구현하신다면 의미가 있을 수도 있겠죠. 하지만 특별히 그렇게 구현할 이유는 없을 것입니다.

CBV는 클래스 상속 문법을 통해, View 구현의 중복을 극적으로 줄여주는 장고의 핵심 기능입니다.
다른 프레임워크에는 없는, 장고 만의 강력한 기능입니다.

살펴보시고 또 질문 남겨주세요.

화이팅입니다. ;-)

커리30님의 프로필 이미지

작성한 질문수

질문하기