Django - Pagination (클래스형 뷰)
Web/Django

Django - Pagination (클래스형 뷰)

뉴비뉴 2019. 8. 5.

전 게시물은 함수형 뷰로 구현했다면 이번에는 클래스형 뷰로 구현해보겠습니다.

 

 

views.py

class borderListView(ListView):
    model = Border # models.py 의 Border 테이블을 model 로 설정해줍니다.
    template_name = 'border/border.html' # 데이터를 전달할(?) 템플릿을 지정
    context_object_name = 'border' # 템플릿에 넘어갈 정보? context 지정
    paginate_by = 10 # 화면에 표시할 게시물은 10개로 제한

    def get_context_data(self, **kwargs):
        context = super(borderListView, self).get_context_data(**kwargs)
        paginator = context['paginator']
        page_numbers_range = 5  # Display only 5 page numbers
        max_index = len(paginator.page_range)

        page = self.request.GET.get('page')
        current_page = int(page) if page else 1

        start_index = int((current_page - 1) / page_numbers_range) * page_numbers_range
        end_index = start_index + page_numbers_range
        if end_index >= max_index:
            end_index = max_index

        page_range = paginator.page_range[start_index:end_index]
        context['page_range'] = page_range
        return context

border.html

{% if is_paginated %}
  <nav aria-label="Page navigation example">
    <ul class="pagination">
      {% if page_obj.has_previous %}
        <li>
          <a class="page-link" href="?page={{ page_obj.previous_page_number }}">
            <span>Prev</span>
          </a>
        </li>
      {% else %}
        <li class="page-item">
          <a href="#" class="page-link">
            <span>Previous</span>
          </a>
        </li>
      {% endif %}

      {% for page in page_range %}
        <li class="page-item" {% if page == page_obj.number %}class="active"{% endif %}>
          <a class="page-link" href="?page={{ page }}">{{ page }}</a>
        </li>
      {% endfor %}

      {% if page_obj.has_next %}
        <li class="page-item">
          <a class="page-link" href="?page={{ page_obj.next_page_number }}">
            <span>Next</span>
          </a>
        </li>
      {% else %}
        <li class="page-item" {% if not page_obj.has_next %}class="disabled"{% endif %}>
          <a class="page-link" href="#">
            <span>Next</span>
          </a>
        </li>
      {% endif %}
    </ul>
  </nav>
{% endif %}

 

paginator 관련 함수는 이전 게시물에 작성되어 있습니다.

 

 

참고 url : https://jupiny.com/2016/11/22/limit-pagination-page-numbers-range/

 

pagination 페이지 숫자 범위 제한하기

Django에서는 pagination를 위한 다양한 기능들을이 기본적으로 구현돼있다. 그래서 간단한 설정만으로도 pagination을 쉽게 구현할 수 있다. 그리고 이 설정에 대한 부분은 문서에 자세히 정리되어 있다. 나는 이 pagination 기능을 이용하여 한 페이지당 10개의 객체들을 보여주는 Class-based view를 아래와 같이 구현하였다. # students/views/list.py from django.views.generic impo

jupiny.com

 

 

댓글

💲 추천 글