페이지네이션 기능을 구현하는 작업을 했다.
기능은 장고의 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 %}
완성사진
댓글