[Python Django] 3-6. CBV ListView - Pagination 응용 get_elided_page_range()

2022. 3. 26. 09:47Python/Django Framework

반응형

기본 pagination을 사용하면 전체 페이지, 현재 페이지, 이전 페이지, 다음 페이지로 이루어진 UI만 제작이 가능하나, get_elided_page_range를 이용하면 현재 페이지를 중심으로 앞 뒤 페이지의 넘버링을 보여주는 UI제작이 가능하다

get_elided_page_range(page_num, on_each_side={int}, on_ends={int})

page_num

  • 현재 페이지

on_each_side

  • 현재 페이지 양 옆으로 나올 다른 페이지의 개수
  • 총 100페이지이고 현재 10페이지, on_each_side값이 3이라면 7,8,9,[10],11,12,13 출력
  • 총 100페이지이고 현재 1페이지 , on_each_side값이 3이라면 [1], 2, 3, 4 출력

on_ends

  • 페이지 양 옆으로 맨 처음, 맨 끝 페이지의 출력 개수
  • 총 100페이지이고 현재 10페이지, on_each_side값이 3, on_ends값이 2이라면 1,2,...,7,8,9,[10],11,12,13,...,99,100 출력

views.py 수정

# board/views.py

class BoardListView(ListView):
    model = Board
    template_name = "board_list.html"
    context_object_name = "board_list"
    ordering = "-id"
    paginate_by = 5
    paginate_orphans = 1
    page_kwarg = "p"

    # get_context_data를 오버라이드 하여 page_list를 생성해준다
    def get_context_data(self, *, object_list=None, **kwargs):
        context = super(BoardListView, self).get_context_data()
        page = context['page_obj']
        paginator = page.paginator
        page_list = paginator.get_elided_page_range(page.number, on_each_side=3, on_ends=2)
        context['page_list'] = page_list

        return context

board_list.html

# pagination 수정

<div>
    <nav>
        <ul class="pagination  justify-content-center">
            {% if page_obj.has_previous %}
                <li class="page-item">
                    <a class="page-link" href="?p={{ page_obj.previous_page_number }}">&laquo;</a>
                </li>
            {% else %}
                <li class="page-item disabled">
                    <a class="page-link" href="javascript:return false">&laquo;</a>
                </li>
            {% endif %}
            {% for page_no in page_list %}
                {% ifequal page_no page_obj.number %}
                    <li class="page-item active">
                        <a class="page-link" href="javascript:return false">
                            {{ page_no }}
                        </a>
                    </li>
                {% else %}
                    <li class="page-item">
                        <a class="page-link" href="?p={{ page_no }}">
                            {{ page_no }}
                        </a>
                    </li>
                {% endifequal %}
                {{ page }}
            {% endfor %}
            {% if page_obj.has_next %}
                <li class="page-item">
                    <a class="page-link" href="?p={{ page_obj.next_page_number }}">&raquo;</a>
                </li>
            {% else %}
                <li class="page-item disabled">
                    <a class="page-link" href="javascript:return false">&raquo;</a>
                </li>
            {% endif %}
        </ul>
    </nav>
</div>
반응형