카테고리 없음

장고 내장 Paginator 기능

abccoco 2022. 6. 9. 01:03

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

기능은 장고의 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 %}

 

완성사진