본문 바로가기
개발/Django_python 웹 프레임워크

Pagination

by 자유로운 코끼리 2020. 7. 23.
728x90

한 페이지에 일정 개수의 게시물만 보이는 페이지네이션을 진행해보겠습니다.

#views.py

from django.core.paginator import Paginator

def main(request):
    blog_all = Blogapp.objects.all().order_by('-id') #쿼리셋, 객체목록 가져오기
    #블로그 객체 세 개를 한 페이지로 자르기
    paginator = Paginator(blog_all,3)
    #블로그 객체 세 개를 한 페이지로 자르기
    page = request.GET.get('page')
    #request된 페이지를 얻어온 뒤 return 해 준다
    posts = paginator.get_page(page)
    # blog_all = blog.all()
    return render(request,'main.html',{'posts':posts})

Paginator을 import 해줍니다.

Paginator함수는 Paginator(object,num)의 형태로 

첫 번째 인자는 페이지에서 분할할 객체, 두 번째 인자는 그 객체들을 num의 개수씩 묶어서 잘라준다는 의미입니다.

 

request.GET.get('page')은

request.GET방식으로 데이터를 가져오는데,

이때 .get()을 통해 'page'를 key값으로 가지는 value를 가져옵니다.

 

posts = paginator.get_page(page)를 통해 출력을 원하는 page를 가져와줍니다.

이때 page값이 없을 경우에는 디폴트로 1이라는 값이 설정되어집니다.

이때 paginator객체에는 다음과 같은 속성들이 있습니다.

paginator.count 게시물의 전체건수
paginator.per_page 페이지당 보여줄 건수
paginator.page_range 페이지의 범위
객체.number 현재페이지 번호
객체.previous_page_number 이전페이지 번호
객체.next_page_number 다음페이지 번호
객체.has_previous 이전페이지 존재여부
객체.has_next 다음페이지 존재여부
객체.start_index 현재 페이지의 시작 인덱스 (1부터 시작하는 인덱스 기준)
객체.end_index 현재 페이지의 끝 인덱스 (1부터 시작하는 인덱스 기준)

그리고 그 post를 main.html로 보내줄께요!

{% for blog in posts %}

posts를 받아서 for문을 돌리면 개수 제한 한 만큼의 게시물만 보여지게 됩니다. 

{%if posts.has_previous%}
<a href="?page={{posts.previous_page_number}}">Previous</a>
{%endif%}

<span>{{posts.number}}</span>

{%if posts.has_next%}
<a href="?page={{posts.next_page_number}}">Next</a>
{%endif%}

 

{%if posts.has_previous%} : 현재 보여지고 있는 페이지가 바로 posts이고, 이 posts에게 이전 페이지가 존재하는지 체크하는 부분입니다. 만약 현재 페이지가 1이라면 if로 둘러싸인 부분은 출력되지 않습니다.

 

<a href="?page={{posts.previous_page_number}}">Previous</a> : posts의 바로 이전 페이지를 의미합니다.

 

{{posts.number}} : 현재 페이지 번호를 의미합니다.

 

{%if posts.has_next%} : posts에게 다음 페이지가 존재하는지 체크합니다. 마지막 페이지라면 if로 둘러싸인 부분은 출력되지 않습니다.

{{posts.next_page_number}} : posts의 바로 다음 페이지를 의미합니다.

 

?page=값 처럼 작성된 부분이 view함수로 page값을 전달하는 부분입니다.

 

댓글