Pagenation

재운·2021년 4월 18일
1
post-thumbnail
post-custom-banner

'페이징'이라고도하는 페이지 매김은 문서를 전자 페이지 또는 인쇄 된 페이지의 개별 페이지로 나누는 프로세스이다.
*출처: wikipedia

말그대로 페이지를 나누는 작업이다. 쇼핑몰 웹페이지같은곳에 가면 상품이 많아 한페이지에 전부 표시하기 어려운 경우,

이와 같이 한 페이지에 일정 개수의 게시물을 표출하고, 여러 페이지로 나눠져 있다.

이를 코드로 구현하기 위한 아이디어를 얻기 위해 처음에는 구글링을 해보았다.
알려져 있는 방식으로는 크게 두가지가 있었다.

  • django의 'paginator' 이라는 모듈을 사용
  • 'offset'과 'limit'을 사용하는 방법

두가지 방법 다 내스타일(?)이 아니어서 나만의 방식으로 구상해보았다.

우선 필요한 정보를 나열해보자면,

  • 표출하고자하는 총 게시물의 수: N
  • 한 페이지에 표출하고자 하는 게시물의 수: Show
  • 요청받은 페이지 번호 : page_no

예를 들어, 총 43개(N=43)의 게시물을 한 페이지에 20개씩(Show=20) 표출한다고 하면, (43개 / 20) 하여 몫이 2이고 나머지가 3이므로 총 3페이지가 생성되게된다.

product_list=[제품1, 제품2, 제품3, ... , 제품43]

1번 페이지(page_no=1) : 제품1 ~ 제품 20 -> 인덱싱 [0:20]
2번 페이지(page_no=2) : 제품21 ~ 제품 40 -> 인덱싱 [20:40]
3번 페이지(page_no=3) : 제품41 ~ 제품 43 -> 인덱싱 [40:43]

이 분류를 잘 살펴보면 페이지 번호가 (총 게시물 수 / 1페이지당 표출하는 게시물 수)의 몫보다 같거나 작을 경우 1페이지당 최대 표출 게시물수만큼 표출하고, 마지막 페이지의 경우 (총 게시물 수 / 1페이지당 표출하는 게시물 수)의 나머지 만큼 게시물을 표출하게 된다.

이를 코드로 표현하면 아래와 같다.

if page_no <= (N // show):
    product_in_page = product_list[show*(page_no-1) : show*page_no]
else:
    product_in_page = product_list[show*page_no : show*page_no + N % show]
    
# product_in_page : 특정 페이지를 요청했을때 표출되는 제품 list
profile
Life is memory
post-custom-banner

0개의 댓글