views.py
와 home.html
두 개만 건들여보자.
우리는 blog 앱에 대해 수정할 거다.
pagination을 사용하기 위해서
views.py
에 import 하자.# views.py from django.core.paginator import Paginator
views.py
의 home 함수를 고칠 거니,# views.py def home(request): blogs = Blog.objects return render(request, 'home.html', {'blogs':blogs})
하나씩 작성해보면,
# views.py def home(request): blogs = Blog.objects # 블로그 모든 글을 대상으로 blog_list = Blog.objects.all() # 블로그 모든 객체를 세개 단위를 한 페이지로 자르기 paginator = Paginator(blog_list, 3) # request 된 페이지가 뭔지를 알아내고 (request 페이지를 변수에 담아내고) page = request.GET.get('page') # request 된 페이지를 얻어온 뒤 return 해준다. posts = paginator.get_page(page) # posts 에는 요청된 페이지가 담겨있으니까, 얘를 return 해주자. return render(request, 'home.html', {'blogs':blogs, 'posts':posts})
이제
home.html
<!-- home.html --> {% for blog in blogs.all %} <br> <div class="container"> <div class="card"> <div class="card-body"> <h5 class="card-title">{{ blog.title }}</h5> <h6 class="card-subtitle mb-2 text-muted">{{ blog.pub_date }}</h6> <p class="card-text">{{ blog.body }}</p> <a href="{% url 'detail' blog.id %}" class="card-link">...more</a> </div> </div> </div> {% endfor %}
여기서 가장 먼저 만져줘야 하는 건
{% for blog in blogs.all %}
이 녀석.이녀석을 해석해보면, blogs 의 모든 객체에 대해 뽑아 내라는 건데,
우리는 그게 아니니까.
하나의 페이지를 대상으로 for문을 돌아야해.
그러니까 이걸 받는 변수는 이제 posts다.
<!-- home.html --> {% for blog in posts %} <br> <div class="container"> <div class="card"> <div class="card-body"> <h5 class="card-title">{{ blog.title }}</h5> <h6 class="card-subtitle mb-2 text-muted">{{ blog.pub_date }}</h6> <p class="card-text">{{ blog.body }}</p> <a href="{% url 'detail' blog.id %}" class="card-link">...more</a> </div> </div> </div> {% endfor %}
그러면, 이렇게 3개가 뜬다음에 우리는 다음 페이지에 접근하도록 만들어줘야하니까,
First
Previous
3of4
Next
Last
이런게 필요한 거지.만들어 보자.
<!-- home.html --> <div class = "container"> {#first previous#} {% if posts.has_previous %} <a href="?page=1">First</a> <a href="?page={{posts.previous_page_number}}">Previous</a> {% endif %} {# 3of4 #} <span>{{posts.number}}</span> <span>of</span> <span>{{posts.paginator.num_pages}}</span> {# Next Last #} {% if posts.has_next %} <a href="?page={{posts.next_page_number}}">Next</a> <a href="?page={{posts.paginator.num_pages}}">Last</a> {%endif%} </div>
여태까지 한 것들을 잘 이해했다면 이 코드를 이해하는게 어렵지 않을것
이해가 안가는 부분
views.py
에서 posts 라는 녀석을 정의하고 이것을 home.html
에서 사용했다.
그렇다면, posts 녀석은 처음에 내가 이 url로 접속했을 때는
몇번째 페이지를 사용자가 접속하는지 모르니, posts를 가져올 수 없다.
즉, 몇번째 페이지를 가져올 지 모르니 posts 라는 변수에는 값이 담길 수 없지 않을까?
하지만 이렇게 코드를 쳤을 때 잘 작동하는 것을 보면,
paginator를 사용하면 자동으로 첫번째 딕셔너리의 키값(1)이
home.html
을 누르면 적용되어 화면이 보여지는 것같다.
즉, page = 1
이런식으로 초기값을 설정해주지 않더라도
Default = 1로 설정되어 돌아가는 듯하다.
사실 게시판은 첫번째부터 보니까.