django paging
대구 올빼미
2019. 12. 28. 10:19
2019. 12. 28. 10:19
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 설계하기
- 이후 입력 url : http://127.0.0.1:8000/?page=1
- list로 처음에 접속하게 되므로 request.GET.get을 통해 페이지 넘버를 가지고 오고
- 그 페이지넘버를 통해 documents의 인덱싱으로 노출될 부분을 결정하고 그것을 render를 통해서 반환을 해준다.
페이징 views.py 심화 설계하기(아래 페이지 넘버 구현하기)
- total_count와 total_page, page_range를 document_list에 보내줌으로서 document_list에서 훨씬 많은 것을 구현 할 수 있다.
- page_range를 통해 이후 템플릿에서 페이지 넘버를 출력하도록 구현한다.
페이징 템플릿 구현하기
- 기본적으로 한번 document 인덱싱을 통해 넘어온 자료이므로 그대로 출력을 해주면 된다.
- 추가적으로 아래에 pagination을 (bootstrap) 달아서 해당 버튼을 클릭할 때 board:index url로 이동하도록 하고 그 주소 뒤에 page={{page}}를 통해 해당 페이지의 url을 연결한다.
- 또한 {{page}}를 통해 번호도 띄어준다.
- 이렇게 구현하면 알아서 컨텐츠가 많아져서 페이지가 넘어가면 추가 된다.