2019.05.13 장고 페이징 기능 구현하기

페이징

  • 컨텐츠를 5개 혹은 10개 등 정해진 갯수에 따라 페이지를 나누어 구현하는 방법

페이징을 배우기 전에 알면 좋은 상식

list에서 불러올 때 컨텐츠가 없을 때

  • Document.objects.all() == get_list
  • 따라서 get_list_or_404를 하면 2가지의 이점을 얻을 수 있다.
    • 해당 Document를 모두 불러올 수 있고, 404 페이지 역시 띄어줄 수 있음

list

  • 폼을 통해서 들어오는 애를 request.POST.get('')을 통해 정보를 가져오고
  • 그냥 들어오는 애들은 get방식 request.GET.get('')을 통해 정보를 가져온다.
    • 이게 주소 뒤에 따라오는 애들을 얻는 방식이다.

페이징 기능 구현 (페이지를 쪼개는 것)

  • 페이지당 몇개를 보여줄것이냐? 그리고 현재 페이지가 중요하다.
  • page = request.GET.get('page',1)
    • 현재 페이지 번호를 가지고 오고 없으면 1을 반환한다.
    • int로 받아와 이것을 start_index와 end_index에도 활용
  • paginated_by = 3 : 한 번에 최대 3개를 보여준다.
  • QuerySet 객체를 슬라이싱 할 때 [시작번호:끝번호]
    • 첫 번째 페이지 0 : 2 == >[ paginated_by x (page-1) : paginated_by x (page) ]
    • 두 번째 페이지 2 : 5 == >[ paginated_by x (page-1) : paginated_by x (page) ]
    • 세 번째 페이지 5 : 8 == >[ paginated_by x (page-1) : paginated_by x (page) ]
    • 만약에 한 페이지에 2개씩 띄어준다고 하면
    • 첫 번째 페이지는 0번에서 1번까지 가지고 오고 [0:2]
    • 두 번째 페이지는 2번에서 3번까지 가지고 오고 [2:4]

페이징 views.py 설계하기

EDAE0AF3-DA6A-4202-9D6F-18AF73EC05C9
  • 이후 입력 url : http://127.0.0.1:8000/?page=1
  • list로 처음에 접속하게 되므로 request.GET.get을 통해 페이지 넘버를 가지고 오고
  • 그 페이지넘버를 통해 documents의 인덱싱으로 노출될 부분을 결정하고 그것을 render를 통해서 반환을 해준다.

페이징 views.py 심화 설계하기(아래 페이지 넘버 구현하기)

9285CCA0-F190-4902-86F6-955B9C5F2E03
  • total_count와 total_page, page_range를 document_list에 보내줌으로서 document_list에서 훨씬 많은 것을 구현 할 수 있다.
  • page_range를 통해 이후 템플릿에서 페이지 넘버를 출력하도록 구현한다.

페이징 템플릿 구현하기

C4EA49CD-90ED-4A62-AA99-1457B2489F97
  • 기본적으로 한번 document 인덱싱을 통해 넘어온 자료이므로 그대로 출력을 해주면 된다.
  • 추가적으로 아래에 pagination을 (bootstrap) 달아서 해당 버튼을 클릭할 때 board:index url로 이동하도록 하고 그 주소 뒤에 page={{page}}를 통해 해당 페이지의 url을 연결한다.
  • 또한 {{page}}를 통해 번호도 띄어준다.
  • 이렇게 구현하면 알아서 컨텐츠가 많아져서 페이지가 넘어가면 추가 된다.

+ Recent posts