코딩공부/Python Django

django Pagination 처리하기

integerJI 2020. 2. 27. 22:21

[django] python django 게시판 만들기 - Pagination

 

홈에 나오는 게시물들을 자른다!


model, admin 설정 : https://integer-ji.tistory.com/89

views에 데이터 가져오기 : https://integer-ji.tistory.com/90

detail page 만들기 : https://integer-ji.tistory.com/91

setting 설정, 데이터 자르기, 정렬하기 : https://integer-ji.tistory.com/93

getbootstrap으로 홈페이지 꾸미기 : https://integer-ji.tistory.com/94

템플릿 상속, url 관리하기 : https://integer-ji.tistory.com/95

디자인 쪼끔 수정 : https://integer-ji.tistory.com/97

글 쓰기 기능 만들기 : https://integer-ji.tistory.com/99

글 수정 기능 만들기 : https://integer-ji.tistory.com/100

글 삭제 기능 만들기 : https://integer-ji.tistory.com/101

form 이용하기, 글 수정 instance 가져오기 : https://integer-ji.tistory.com/102


home 함수 수정

from django.core.paginator import Paginator

def home(request):
    blogs = Blog.objects.order_by('-id')
    blog_list = Blog.objects.all().order_by('-id')
    paginator = Paginator(blog_list,3)
    page = request.GET.get('page')
    posts = paginator.get_page(page)

    return render(request,'home.html', {'blogs':blogs,'posts':posts} )

 

paginator을 import 해줍니다.

 

home 함수를 변경할 건데 지금은 그냥 Blog의 객체 전부를 홈에 나타내 줍니다. 

 

블로그 객체들을 blog_list에 새로 담고 paginator이란 변수에 Paginator를 이용해 3개씩 자른 blog_list를 넣어줍니다.

 

잘린 3개씩 들어있는 blog_list를 page에 넣어줍니다.

 

page를 출력하기 위해 posts에 넣어줍니다.

 

 

home.html 수정

{% extends 'base.html' %}

{% block content %}

      {% for blog in posts %}
      <div class="container"> 
      <div class="card">
        <div class="card-body">
        <h1>{{ blog.title }}</h1>
        <p>{{ blog.pub_date | date:"Y-m-d" }}</p>
        <p>{{ blog.summary }}<a href="{% url 'detail' blog.id %}"> ...자세히 보기</a></p> 
        </div>
      </div>
      </div>
      <br>
      {% endfor %}

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

      <span>{{posts.number}}</span>
      <span>of</span>
      <span>{{posts.paginator.num_pages}}</span>

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

{% endblock %}

 

for blog in posts가 수정되었습니다.

 

블로그에 있는 모든 글을 가져오는 것이 아니라

 

3개로 잘린 page를 가져와야 합니다. posts로 변경

 

post.has_previous가 추가되었습니다.

 

만약 이전 페이지가 존재하지 않으면 나 타지 않습니다.

 

그리고 현재 페이지 번호와 총페이지를 나타내 줍니다.

 

다음은 다음 페이지를 나타내 줍니다. 마찬가지로 다음 페이지가 없으면 출력되지 않습니다.

 

 

확인

 

첫 페이지는 이전으로 갈 페이지가 없으니 if문이 실행되지 않습니다.

 

 

 

 

12페이지 중 2번째 페이지입니다.

 

 

 

마지막 페이지도 무사히 나옵니다.

 

 

git push

git init

git add .

git commit -m "코멘트"

 

git push origin master

 

 

---

 

빠르게 프로젝트에 진입하기 위해 진도부터 확 빼기