ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [django] 하나의 URL 에서 여러 페이지네이션 구현하기
    Python & Django 2021. 9. 10. 03:47

    home 화면에 movies, books, people 각각의 페이지네이션을 구현하고자 함. 그런데 url 에 ?page= 로 페이지번호를 받아오면, movies, books, people 이 페이지가 모두 동일해져버림.. 이를 해결하기 위해 ?movie_page= 이런 식으로 각각 page 를 만들어주고, request 로 url 에서 받아옴.

    from django.shortcuts import render
    from django.core.paginator import Paginator
    from movies import models as movie_models
    from books import models as book_models
    from people import models as people_models
    
    def resolve_home(request):
      movie_page = request.GET.get("movie_page")
      movie_list = movie_models.Movie.objects.all()
      movie_paginator = Paginator(movie_list, 5)
      movies = movie_paginator.get_page(movie_page)
    
      book_page = request.GET.get("book_page")
      book_list = book_models.Book.objects.all()
      book_paginator = Paginator(book_list, 5)
      books = book_paginator.get_page(book_page)
    
      person_page = request.GET.get("person_page")
      person_list = people_models.Person.objects.all()
      person_paginator = Paginator(person_list, 5)
      people = person_paginator.get_page(person_page)
      return render(request, "home.html", {"movies":movies, "books":books, "people":people})

    html 에서도 그냥 ?page= 가 아니라 ?movie_page= 와 같은 방법으로 세 가지 각각의 페이지네이션 구현. movies 의 페이지를 넘기더라도 books, people 의 페이지에는 영향 없음.

    <h1>Welcome home</h1>
    
    <div>
      <h2>Latest Movies</h2>
      <ul>
        {% for movie in movies %}
          <li>{{movie.title}}</li>
        {% endfor %}
      </ul>
      <span>
          {% if movies.has_previous %}
            <a href="?movie_page=1">&laquo; first</a>
            <a href="?movie_page={{movies.previous_page_number}}">Previous</a>
          {% endif %}
          <span>
            Page {{movies.number}} of {{movies.paginator.num_pages}}
          </span>
          {% if movies.has_next %}
            <a href="?movie_page={{movies.next_page_number}}">Next</a>
            <a href="?movie_page={{movies.paginator.num_pages}}">last &raquo;</a>
          {% endif %} 
        </span>
    </div>
    <div>
      <h2>Latest Books</h2>
      <ul>
        {% for book in books %}
          <li>{{book.title}}</li>
        {% endfor %}
      </ul>
      <span>
          {% if books.has_previous %}
            <a href="?book_page=1">&laquo; first</a>
            <a href="?book_page={{books.previous_page_number}}">Previous</a>
          {% endif %}
          <span>
            Page {{books.number}} of {{books.paginator.num_pages}}
          </span>
          {% if books.has_next %}
            <a href="?book_page={{books.next_page_number}}">Next</a>
            <a href="?book_page={{books.paginator.num_pages}}">last &raquo;</a>
          {% endif %} 
        </span>
    </div>
    <div>
      <h2>Latest People</h2>
      <ul>
        {% for person in people %}
          <li>{{person.name}}</li>
        {% endfor %}
      </ul>
      <span>
          {% if people.has_previous %}
            <a href="?person_page=1">&laquo; first</a>
            <a href="?person_page={{people.previous_page_number}}">Previous</a>
          {% endif %}
          <span>
            Page {{people.number}} of {{people.paginator.num_pages}}
          </span>
          {% if people.has_next %}
            <a href="?person_page={{people.next_page_number}}">Next</a>
            <a href="?person_page={{people.paginator.num_pages}}">last &raquo;</a>
          {% endif %} 
        </span>
    </div>

     

Designed by Tistory.