Leta Learns

django | Pagination 본문

Django

django | Pagination

leta 2021. 7. 18. 19:11

Paginaton : 데이터를 페이지 별로 나눠서 보내주는 것. 

                Paginator라는 모듈을 통해 pagination기능 제공

 

Paginator 사용 이유

  • UI/UX적인 편리함을 제공하기 위해
  • 서버 부하 줄이기 위해

 

blog/views.py (-> Paginator)

# 이전 import문들..
from django.core.paginator import Paginator

def home(request):
    blogs = Blog.objects.all() #blog 객체를 모두 가져옴
    paginator = Paginator(blogs, 3) # blogs를 3개씩 나눔
    page = request.GET.get('page') # 해당 정보가 오지 않아도 넘어간다
    paginated_blogs = paginator.get_page(page)
    return render(request, 'home.html', {'blogs': paginated_blogs})

paginator = Paginator(blogs, 3)

#첫 번째 인자: 분할할 객체, 두 번째 인자: 한 페이지에 담길 객체 수page =

 

request.GET.get('page')

# 그동안 사용했던 request.GET['page'] : request에 'page'가 없으면 MultiValueDictKeyError 발생

request.GET.get('page') : request에 'page' 없으면 None 리턴.

 

paginated_blogs = paginator.get_page(page)

#페이지 번호를 받아서 해당 페이지 반환,

  인자로 None이 들어간다면 첫 번째 페이지 반환.

 

 

 

blog/templates/home.html (-> 템플릿 수정)

{% extends 'base.html' %}
  {% block content %}
    {% if user.is_authenticated %}
      {{user.location}}에 사는 {{user.university}} 다니는 {{user.nickname}}님 안녕하세요!
    {% endif %}
    <h1>Blog Project</h1>
    <h4><a href="{% url 'blog:new' %}">New Post</a></h4>

    <div class="conatainer">
      {% for blog in blogs%}
      <div>
        <h3>{{ blog.title }}</h3>
        {{ blog.id }} <br />
        {{ blog.writer }} <br />
        {{ blog.summary }}
        <a href="{% url 'blog:detail' blog.id %}">...more</a>
      </div>
      {% endfor %}
    </div>

    <br/>

    <div class="paginator">
      {% if blogs.has_previous %}
      <a href="?page=1">처음</a>
      <a href="?page={{blogs.previous_page_number}}">이전</a>
      {% endif %}
      <span>{{blogs.number}}</span>
      <span>of</span>
      <span>{{blogs.paginator.num_pages}}</span>
      {% if blogs.has_next %}
      <a href="?page={{blogs.next_page_number}}">다음</a>
      <a href="?page={{blogs.paginator.num_pages}}">마지막</a>
      {% endif %}
    </div>
  {% endblock %}

<div class = "paginator">

 

{% if blogs.has_previous %}

# has_previous: 이전 페이지의 유무를 boolean 형태로 반환.

   이전 페이지가 있다면 (첫 번째 페이지가 아니라면), if문 내부 요소들을 보여준다.

 

{{blogs.previous_page_number}}

# 이전 페이지 반환

 

{{blogs.next_page_number}}

# 다음 페이지 반환

 

{{blogs.paginator.num_pages}}

# 총 페이지 수 반환 (마지막 페이지)

   page == 총페이지수 라면, 마지막 페이지를 의미...

 

<a href="?page=1">

: 쿼리스트링. 데이터를 전달하는데 사용

   '?' 로 시작. '&'를 통해 여러 데이터를 동시에 전달 가능.  

  2021.07.18 - [Django] - 쿼리 스트링 Query String  

 

 

 

 

blog/views.py (-> 최신글부터 보여주기, 원하는 데이터만 보여주기)

def home(request):
    blogs = Blog.objects.order_by('-pub_date') # -를 넣어주면 역순 정렬. 내림차순: 최신글
    search = request.GET.get('search')

    if search == 'true':
        author = request.GET.get('writer')
        blogs = Blog.objects.filter(writer=author)

    paginator = Paginator(blogs, 3) 
    page = request.GET.get('page') 
    paginated_blogs = paginator.get_page(page)
    return render(request, 'home.html', {'blogs': paginated_blogs})

order_by()

# 데이터를 정렬해서 가져옴.

   정렬 조건을 인자에 넣기. 조건에 '-' 붙이면 역순 (내림차순) 정렬.

   최신순으로 정렬하기 위해 '-pub_date'를 인자로.

 

filter()

# 조건을 걸어서 원하는 데이터만 가져오기.

   author = request.GET.get('writer')

      # url에서 writer 값을 찾아오고 이를 author에 저장.

   Blog.objects.filter(writer = author)

      # writer 필드 값이 내가 찾는 writer값인 author인 경우의 객체를 찾는다.

   => 검색기능 구현.

 

예시로 간략히 설명하면,

   abc라는 writer가 쓴 글을 검색하고 싶은 경우, abc를 찾아와서 author에 저장하고

   writer 필드 값이 abc에 해당하는 객체를 찾는다. => 검색 기능!

 

   url 주소에 쿼리스트링으로 입력하면 필터링 가능.

   쿼리 스트링은 GET 요청으로 데이터 보낼 때 쓰는 것.

   filter는 ORM에서 제공하는 기능. DB에서 조건 걸어서 데이터 추출하는 것.

 

 

 

 

view 수정 후 template도 수정

blog/templates/home.html

{% extends 'base.html' %}
  {% block content %}
    {% if user.is_authenticated %}
      {{user.location}}에 사는 {{user.university}} 다니는 {{user.nickname}}님 안녕하세요!
    {% endif %}
    <a href="?search=true&writer={{user.nickname}}">내가 쓴 글</a>
...

 

 

쿼리스트링을 통해 필터링이 이루어져서 내가 작성한 글을 확인할 수 있음. (검색 기능 구현)

 

 

'Django' 카테고리의 다른 글

django | Model Extension  (0) 2021.07.18
쿼리 스트링 Query String  (0) 2021.07.18
django | User 모델을 이용한 Signup, User 확장  (0) 2021.07.16
django | User 모델을 이용한 login, logout  (0) 2021.07.13
django | Forms  (0) 2021.07.08
Comments