완숙의 블로그

[Django] Week 5_4 Pagination Practice 본문

Programing Language/Web_Django

[Django] Week 5_4 Pagination Practice

완숙 2019. 3. 9. 11:48

views.pyhome.html 두 개만 건들여보자.

 

  1. 우리는 blog 앱에 대해 수정할 거다.

  2. pagination을 사용하기 위해서 views.py 에 import 하자.

    # views.py
    from django.core.paginator import Paginator
    
  3. views.py 의 home 함수를 고칠 거니,

    # views.py
    def home(request):
        blogs = Blog.objects
        return render(request, 'home.html', {'blogs':blogs}) 
    
  4. 하나씩 작성해보면,

    # 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}) 
    
  5. 이제 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문을 돌아야해.

  6. 그러니까 이걸 받는 변수는 이제 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 %}
    
  7. 그러면, 이렇게 3개가 뜬다음에 우리는 다음 페이지에 접근하도록 만들어줘야하니까,

    First Previous 3of4 Next Last 이런게 필요한 거지.

  8. 만들어 보자.

    <!-- 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로 설정되어 돌아가는 듯하다.

사실 게시판은 첫번째부터 보니까.

Comments