한 페이지에 일정 개수의 게시물만 보이는 페이지네이션을 진행해보겠습니다.
#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값을 전달하는 부분입니다.
'개발 > Django_python 웹 프레임워크' 카테고리의 다른 글
ModelForm - 댓글 달기 (6) | 2020.07.29 |
---|---|
ModelForm - Forms.py (0) | 2020.07.25 |
로그인, 회원가입 3 -User Model 확장 / OneToOneField 사용 (0) | 2020.07.21 |
로그인, 회원가입 2 -Blog Model - User Model 연동, 1:N (1) | 2020.07.20 |
Django 회원가입, 로그인 (1) | 2020.07.20 |
댓글