#15 페이징
지금까지 만든 웹사이트는 아직 페이징 처리가 되어있지 않아 모든 게시글을 한페이지에 전부 표시하도록 되어있다.
이번에는 페이징을 적용하여 한 페이지에 표시할 수 있는 게시글의 수를 제한할 수 있도록 한다.
1. 테스트 데이터 생성
페이징이 제대로 이루어지는지 확인하려면 다수의 게시글이 필요하다. 장고 쉘로 테스트데이터를 생성해보자.
python manage.py shell 을 실행하여 장고 쉘에 진입한 뒤 Question 모델과 timezone 모듈을 import 하여
반복문으로 300개의 Question 인스턴스를 생성, 저장한다.
다시 사이트에 접속해보면 추가된 300개의 데이터가 모두 한 페이지에 표시되는 것을 볼 수 있다.
2. Paginator
장고에서는 Paginator 라는 클래스를 사용하여 페이징을 할 수 있다.
pybo/views.py 의 index 함수를 위와 같이 수정하여 페이징을 적용한다.
템플릿에서도 페이징을 적용하기 위해 question_list.html 을 위와 같이 수정한다. 이전이나 다음 페이지가 있다면
이전과 다음 링크가 활성화되게 하고 페이지 리스트중 현재 페이지는 강조되도록 하였다.
사이트에 다시 접속하면 정상적으로 페이징 처리가 된 것을 볼 수 있다. 문제는 페이징 영역에 존재하는 모든 페이지가
표시된다는 것이다.
템플릿을 위와 같이 조금 수정한다. |add:-5 나 |add:5 는 템플릿 필터로 question_number 값에 각각 -5, 5를 더해준다는
의미이다. 즉, 페이지영역의 표시범위를 현재페이지로부터 이전 5개붙어 다음 5개까지로 제한하는 코드이다.
사이트에 다시 접속해보면 페이지지가 현재페이지의 전후로 5페이지까지만 표시되는 것을 볼 수 있다.
3. 처음과 끝 추가
강좌에 따로 방법이 소개되어있진 않지만 이번에 배운것을 응용하여 첫 페이지와 끝 페이지로 바로 이동하는 기능을
추가해보자.
먼저 이전 페이지 링크 위에 1 페이지가 페이지목록에 보이지 않는 경우, 즉 현재 페이지가 7 페이지 이상인 경우
첫 페이지로 이동하는 링크가 나타나도록 한다.
그리고 다음 페이지 링크 아래에 마지막 페이지가 목록에 보이지 않는 경우, 즉 현재 페이지가 마지막페이지수 - 5 보다
작은 경우 끝 페이지로 이동하는 링크가 나타나도록 한다. 총 페이지 수는 <page오브젝트>.paginator.num_pages 로
얻을 수 있다.
4. 이전, 다음 페이지 수정
강좌에서는 이전이나 다음 페이지가 없더라도 링크를 비활성화할 뿐 표시는 하도록 구현하였지만 실제 게시판의
상당수가 이전이나 다음 페이지가 없다면 링크 자체가 나타나지 않도록 구현되어있다.
이전, 다음 페이지가 없다면 링크를 표시하지 않도록 question_list.html을 위와 같이 수정한다.
이제 이전 페이지나 다음 페이지가 없다면 링크가 표시되지 않는다.