해결된 질문
작성
·
457
·
수정됨
0
Q1, Q2, Q3 이 있는데 Q1은 해결한것 같습니다(?)
강의 슬라이드에서
필기 해주실때
paginate_by=10 넘겨줄때 page=3 이라고 하셨는데
paginate_by = ~개씩 보기
page = 몇 페이지에서의 (현재 보는 페이지)
라는 의미라면
page 라는 이름의 매개변수까지 전달해주면 혹시 어디로 전달되나요? page라는 값은 쿼리할때도 응답받으로때도 계속 코드에서 기억하고 있어야 할 것 같은데 안보이고있네요..ㅎㅎ
살펴보고있는데 page라는 변수는 클래스변수에도 없고 위 그림의 paginate_queryset 메서드의 인자로도 없고 그래서요 (물론 리턴값으로는 나오지만..)
자문자답
아 paginate_queryset 메서드 상단에 있었네요.
(그전 DetailView에서 pk, slug 식별자가 디폴트였던것처럼)
page 매개변수
도 page_kwargs 클래스변수로 있고 그 값을 룩업 해서 self.kwargs 라는 딕셔너리 클래스변수에서 먼저 뒤지고없다면 아예 HttpRequest 객체에서 뒤지고
그래도 없다면 1(첫페이지) 로 하드코딩해서 초기화 하네요
그리고 pagination_queryset 메서드
의 page_size 매개변수는 어떤 의미 인가요? 보니깐 get_paginate_by(self, queryset)
로 그냥 단순 paginate_by (몇개씩 볼껀지) 클래스변수를 그대로 getter 해오고 page_size 라는 get_context_data메서드 내 지역변수
로 쓰고 버리던데...? 궁금합니다
자문자답
-> 조회한 전체 qs 수 군요~
get_paginate_by 메서드
에 왜 QuerySet 객체가 있을까요? 분명히 이렇게 설계한 이유가 있을꺼 같은데?
왜냐면 get_context_data 메서드
안에서
get_paginate_by(queryset: QuerySet)
호출한번하는데
사실상 API는 get_paginate_by 메서드
는 단순하게 클래스변수인 self.paginate_by 를 리턴해주고 있어서 여쭤봅니다.
답변 2
1
page_size 는 한 페이지에서 보여줄 개수입니다.
page_size 값의 유무로 페이징 처리 여부를 판단하구요.
paginate_queryset 메서드에서는 page_size를 Paginator 생성 시에 사용하고 있습니다.
소스코드를 읽기만 하기보다, 디버거를 물려서 한 step 씩 break point를 이동하며, 각 값들의 변화를 예상해보시고 확인하시는 과정을 수행해보시는 것을 추천드립니다. 막연히 상상만 하는 코드 리딩보다 이해도가 훨씬 좋아집니다.
get_paginate_by 메서드에서 queryset 인자를 왜 받는 지는 정확히는 저도 잘 모르겠습니다.
막연히 상상해보자면 ...
get_paginate_by 메서드를 구현한다는 것은 동적으로 page size를 결정할 목적일테니
queryset.count() 를 통해 Rows 개수가 너무 적을 경우에는 페이징 처리를 하지 않도록 해볼 수도 있을 듯 합니다.
화이팅입니다. :-)
0
감사합니다.!
저희가 주입해주는 get_paginate_by 클래스변수와 API 메서드 내 page_size 지역변수 둘다 한페이지내 보여줄 객체 갯수를 의미한다.
그리고
get_paginate_by 메서드는 뭔가 오버라이딩 해서 개발할때 필요한 인자일수도있어서 만든사람이 넣어놓거 같기도 한거 같았습니다.
이런식으로 디버깅 이용해서도 명확하게 해봐야겠네요. 감사합니다!