본문 바로가기

Web Programming/Django

페이지 나누기(Pagination)

글의 수가 몇 개 없을 때는 상관이 없지만 글의 수가 무수히 많아질 경우에

한 페이지에 한 번에 글을 전부 다 띄워주게 되면 로딩 시간과 사용에 불편함 등 여러가지 문제점이 발생한다

그래서 페이지를 나누어서 보여주는 것이 효과적인데 장고에서는 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