장고 - Pagination 구현 방법

게시판(board) 프로젝트를 예로 들어보자.

1. 뷰에서 페이지 설정

  • 경로 : board_project > board > views.py

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    # all 전체를 가져온다.
    def document_list(request):
    documents = Document.objects.all()
    page = int(request.GET.get('page', 1))
    # page가 없다면, default값 1로 설정
    # --> 127.0.0.1:8000/ 검색 시, 127.0.0.1:8000/?page=1 로 url 변환
    paginated_by = 3
    # paginated_by : 페이지당 갯수

    # Documents 객체 전체 갯수
    total_count = len(documents)
    # 전체 페이지 계산
    total_page = math.ceil(total_count/paginated_by)
    # 페이지 1부터 끝까지 범위 설정
    page_range = range(1, total_page+1)
    # 첫 페이지 인덱스와 마지막 페이지 인덱스 설정
    start_index = paginated_by * (page-1)
    end_index = paginated_by * page
    documents = documents[start_index:end_index]

    return render(request, 'board/document_list.html', {'object_list':documents, 'total_page':total_page, 'page_range':page_range})

2. 템플릿에서 페이지 디자인 설정

  • 경로 : board_project > board > templates > board > document_list.html
    1
    2
    3
    4
    5
    6
    7
    <nav aria-label="Page navigation example">
    <ul class="pagination">
    {% for page in page_range %}
    <li class="page-item"><a class="page-link" href="{% url 'board:list' %}?page={{page}} ">{{page}}</a></li>
    {% endfor %}
    </ul>
    </nav>