글의 수가 몇 개 없을 때는 상관이 없지만 글의 수가 무수히 많아질 경우에
한 페이지에 한 번에 글을 전부 다 띄워주게 되면 로딩 시간과 사용에 불편함 등 여러가지 문제점이 발생한다
그래서 페이지를 나누어서 보여주는 것이 효과적인데 장고에서는 Pagination을 활용하여 페이지를 나눌 수 있다
먼저, views.py에서 다음의 코드를 통해 기존의 모든 blog 객체를 주는 것에서 posts로 나누어서 주는 방법을 택한다
1 2 3 4 5 6 7 8 9 10 11 | # project/blog/views.py from django.core.paginator import Paginator ... def home(request): blogs = Blog.objects blog_list = Blog.objects.all().order_by('-id') # 블로그 객체 최신순나열 paginator = Paginator(blog_list, 3) # 3개씩 잘라내기 page = request.GET.get('page') # 페이지 번호 알아오기 posts = paginator.get_page(page) # 페이지 번호 인자로 넘겨주기 return render(request, 'home.html', {'blogs' :blogs, 'posts': posts}) | cs |
그 다음, template 파일에서 blogs로 for 반복문을 돌던 것을 posts로 수정해준다
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | # project/blog/template/home.html {% for blog in posts %} <br> <div class="container"> <a href="{% url 'detail' blog.id %}"> <h1>{{ blog.title }}</h1> </a> <p>{{ blog.pub_date_pretty }}</p> <p>{{ blog.summary }}<a href="{% url 'detail' blog.id %}">.... more</a> </p> </div> {% endfor %} | cs |
그리고 페이지의 안내
처음 이전 현재페이지of전체페이지 다음 끝
의 양식을 맞춰서 다음의 코드를 추가해준다
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | # project/blog/template/home.html {% if posts.has_previous %} <a href="?page=1">First</a> <a href="?page={{posts.previous_page_number}}">Previous</a> {% endif %} {# NowOfTotal #} <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 %} | cs |
여기까지 완성하게 되면 다음의 화면과 같이 페이지나누기가 완료된다
'Web Programming > Django' 카테고리의 다른 글
Form 활용하기 (0) | 2019.02.16 |
---|---|
Blog 프로젝트 정리 (0) | 2019.02.12 |
로그인 & 회원가입 (0) | 2019.02.09 |
가짜 데이터 만들기(Faker 패키지) (0) | 2019.02.09 |
장고 보다 간편화하기(Base, url 정리) (0) | 2019.02.02 |