Web Programming/Django
페이지 나누기(Pagination)
bale.yoon
2019. 2. 10. 01:25
글의 수가 몇 개 없을 때는 상관이 없지만 글의 수가 무수히 많아질 경우에
한 페이지에 한 번에 글을 전부 다 띄워주게 되면 로딩 시간과 사용에 불편함 등 여러가지 문제점이 발생한다
그래서 페이지를 나누어서 보여주는 것이 효과적인데 장고에서는 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 |
여기까지 완성하게 되면 다음의 화면과 같이 페이지나누기가 완료된다