Django - Pagination
Web/Django

Django - Pagination

뉴비뉴 2019. 8. 2.

Pagination

한 페이지에 보이는 게시물의 수를 설정하고, 다음 페이지로의 연결을 설정하고 싶을 때 유용하게 사용할 수 있다.

 

Pagination 을 설정하지 않은 상태이다. 게시물은 11개가 생성되어있고, Pagination을 설정하기 전이다.

def border(request):
    borders = Border.objects.all()

    paginator = Paginator(borders, 10) # 게시물 10개 제한

    page = request.GET.get('page')  # ?page=1

    borders = paginator.get_page(page)

    return render(request, 'border/border.html', {'border':borders})

우리가 보고 있던 페이지에 Paginator을 설정해주었다, Paginator는 한 페이지에 보일 게시물을 제한한다.

request.GET.get('page') # 127.0.0.1:8000/border/?page=1 과 같은 GET 방식으로 url 을 받을 수 있다.

 

위와 같이 설정해주고 웹 사이트를 새로고침해보자.

 

게시물이 10개만 출력되는 것을 확인할 수 있다.

여기서 의문이 든다. 11번 째 게시물은 어디로 갔을까? 한번 확인해보도록 하자.

 

위에 설명했다 싶이 GET 방식으로 url 을 불러온다?

http://127.0.0.1:8000/border/?page=2 로 입력해주면 11번 게시물이 보이는 걸 확인할 수 있다.

마지막으로 자주 쓰이는 객체들을 테스트해보면서 이해하고 마무리해보자.

border.html 에서 아래와 같은 코드를 테스트해보았다.

설명은 주석으로 대신한다.

<div class="pagination">
    {{ border.number }} <!-- 현재 페이지(1) number -->
    {{ border.paginator.count }} <!-- 모든 게시물 수(11) 10개로 제한했기 때문에 11번 째 게시물은 2페이지로 -->
    {{ border.paginator.num_pages }} <!-- 모든 페이지 수(2) -->
    {{ border.paginator.page_range }} <!-- range(1,3) = 1~2 -->
    {{ border.has_previous }} <!-- False 페이지1의 전 페이지는 없기 때문에-->
    {{ border.has_next }} <!-- True 페이지1의 다음 페이지가 있기 때문에-->
</div>

 

[!] 해당 글을 작성하면서 이상한 점을 발견했다. id 의 값이 page2로 갔더니 다시 1부터 시작하고 있었다.

해결방법은 아래와 같다. forloop.counter

{{forloop.counter0|add:border.start_index }}

페이지의 수를 출력하고, 현재 있는 페이지를 strong 표시하라.

{% for num in border.paginator.page_range %}
    {% if border.number == num %} <!-- 현재 있는 페이지가 num과 같다면-->
        <strong>{{ num }}</strong> <!-- 조건에 맞는 페이지 번호가 굵게 표시 -->
    {% else %}
        {{ num }} <!-- 나머지 페이지들은 그냥 출력-->
    {% endif %}
{% endfor %}

 

 

 

 

 

참조 url

https://www.youtube.com/watch?v=Z8MDdDyB_6A

http://www.sci-blog.com/2010/03/using-forloop-counter-in-django-pagination.html

 

Using forloop counter in django pagination

In order to use forloop.counter with pagination use: {% for object in object_list %} {{ page_obj.start_index|add:forloop.counter0 }} {% endfor %}

www.sci-blog.com

 

댓글

💲 추천 글