본문 바로가기
카테고리 없음

장고 내장 Paginator 기능

by abccoco 2022. 6. 9.

페이지네이션 기능을 구현하는 작업을 했다.

기능은 장고의 Paginator 기능을 사용해서 구현했고

다음번에는 내장 기능없이도 구현해보자.

프로젝트에서는 장르별 이름을 가져와야되서 url.py에서 <str:name>도 가져왔지만

여기서는 헷갈릴수 있으니 생략하고 페이지네이션에서 필요한 코드들만 보자

 

 

views.py

먼저 사용하기 위해서 Paginator을 임포트 해주자!

from django.core.paginator import Paginator

 

변수 test를 만들고 해당하는 모델의 해당하는 objects를 가져온다

def test(request):
    board_list = BookModel.objects.all()

 

내장 Paginator 기능 중 'page'

GET 방식으로 데이터를 가져온다 ('page', 1) 여기서 1은 아무 데이터가 없을때

페이지는 1페이지부터 시작된다는 의미이다.

    page = request.GET.get('page', 1)

 

이제 내장 Paginator 기능 중 'Paginator'

가져온 objects가 담겨 있는 book_list를 10번만 출력해준다는 의미이다

한 페이지에 10개씩의 정보만 담길것이다

다른 정보들은 다음 페이지에서, 10개 그 다음 페이지에서 10개씩 모든 데이터를 출력한다.

    paginator = Paginator(books_list, 10)

 

page에 담겨있는 페이지 번호를 받아, 해당 페이지를 리턴시키기 위해 값을 psges 안에 넣어준다

    pages = paginator.page(page)

 

마지막으로 해당 html로 리턴시켜준다.

    return render(request, 'main_genre/genre.html', {'pages': pages} )

 

 

view.py 전체 코드

전체 코드에서는 book_all로 보내주겠다.

어떻게 보내든 상관은 없다.

from django.core.paginator import Paginator

def test(request):
    board_list = BookModel.objects.all()
	page = request.GET.get('page', 1)
    paginator = Paginator(books_list, 10)
    pages = paginator.page(page)

     book_all = {
        'pages': pages,
    }
    return render(request, 'main_genre/genre.html', {'book_all': book_all})

 

 

HTML

Previous 클릭시 page = page -1 , Next 클릭시 page = page + 1

(if 조건을 입력함으로써 전후 page가 존재 여부에 따라 보이지않게 설정)

# if book_all의 (views.py에서 보내주는 딕셔너리 'key')
# pages의 (번호를 +,-해서 넘어가기 때문에 작성함) has_previous 라면
{% if book_all.pages.has_previous %}
	# a태그를 넣어서 주소 pages의 숫자를 -1해준다
    # 각각의 페이지의 url은 숫자로 이루어져 있으니 숫자를 빼주면 다른 페이지로 이동하는것이다.
    <a href='?page={{ book_all.pages.number|add:-1 }}'>Previous</a>
# 종료
{% endif %}

 

현제 페이지를 숫자로 표시해주기

아래의 코드 결과

# pages의 숫자 / pages의 paginaior의 숫자.
# 다시 말해 페이지네이터에 있는 숫자(전체 숫자)
Page {{ book_all.pages.number }} of {{ book_all.pages.paginator.num_pages }}

 

url의 숫자를 1씩 더해주어 페이지를 이동시킨다

{% if book_all.pages.has_next %}
	<a href='?page={{ book_all.pages.number|add:+1 }}'>Next</a>
{% endif %}

 

 

HTML 전체 코드

{% if book_all.pages.has_previous %}
    <a href='?page={{ book_all.pages.number|add:-1 }}'>Previous</a>
{% endif %}

Page {{ book_all.pages.number }} of {{ book_all.pages.paginator.num_pages }}

{% if book_all.pages.has_next %}
    <a href='?page={{ book_all.pages.number|add:+1 }}'>Next</a>
{% endif %}

 

완성사진

 

댓글