완숙의 블로그

[Django] Week 5_3 Pagination Theory 본문

Programing Language/Web_Django

[Django] Week 5_3 Pagination Theory

완숙 2019. 3. 9. 11:46

지금까지 만든 블로그의 문제는!

글이 계속 아래로만 생성된다는 것이다. 이런식으로.

2019-03-03 8 45 03

저 밑에까지 언제 읽고 앉아있냐 ㅠㅜ..

그러니까 적당히 끊어줄 필요가 있다!

 

Pagination

나중에 게시판 만들어보면 이게 필수적이다! ㅠㅜ

자, 열심히 해보자.

문제상황을 명확히 하는 것이 문제를 푸는데 있어 항상 우선적인 역할을 한다.

먼저, 이 Pagination을 하고 싶다면,

무엇이 필요할지 생각해보자.

 

  1. 화면이 보여져야 한다. Templates
  2. 세 개의 블로그 객체를 한 페이지로 출력해줘! 데이터 처리를 담당하는 Views

 

자, 이 pagination 역시, 장고에서 기본적으로 지원하는 기능이다.

그러면 이것을 사용하기 위해서는 앞에서부터 배워왔듯이,

import 작업을 해줘야 한다.

 

views.py

  1. import

    # views.py
    from django.core.paginator import Paginator
    
  2. 무슨 객체를, 한 페이지 당 몇 개씩 Pagination 할지 결정해야 한다.

  3. 위에서 페이지 단위로 잘랐다면,

    이제는, 전체 데이터가 아닌, 페이지를 한 단위로 갖고 놀자

 

그림으로 보자.

2019-03-03 8 56 59

 

2019-03-03 8 59 52

와 너무쉽다. (아니면 미안)

왜 쉽냐, 결국 다 구현이 되어 있고, 갖다가 쓰기만 하면된다.

 

자 정리하면,

2019-03-03 9 00 20

오히려 실습하면 별것 아니라고 느낄 거야!

 

코드로 작성했을 때,

잘라진페이지들의묶음 = Paginator(Blog, 3) # 블로그를 3개단위로 잘라서 그 뭉텅이로 가지고 있어
그잘라진페이지의2번째녀석 = 잘라진페이지들의묶음.get_page(2) # 그 잘린녀석들 중 2번째를 넣어줘
그잘라진페이지의2번째녀석.view() # 정확하지 않은데 이런 느낌이야

 

이걸 굳이 작성해서 보여주는 이유는,

Paginator 객체와, Page 객체와이 차이를 알려주기 위해서 썼다.

결국 그림으로 보면 이런 느낌이다.

2019-03-03 9 05 29

결국 우리가 원하는 건 빵한조각 이라는 걸 유념하고 시작하자.

 

Page 객체의 method 함수

2019-03-03 9 06 42

2019-03-03 9 09 32

 

  1. page.count()

    총 객체가 몇개?

    출력 = 12

  2. page.num_page()

    3개씩 자른 페이지가 총 몇개?

    출력 = 4

  3. page.page(n)

    n번째 페이지 반환

  4. page.page_range()

    총 페이지가 4개면

    출력 = [1,2,3,4]

  5. get_page(n)

    n번째 페이지를 갖고와!

  6. has_next

    다음페이지가 있니?

    출력 = 1, 0

  7. 등등..

 

Request 받은 페이지 번호는 어떻게 알 수 있나?

page = request.GET.get('page')

앞부분은 GET 방법으로 보낸 정보에 접근하는 방식인 것을 알겠는데

뒷부분이 이해가 안된다..

 

Dictionary 자료형

더 궁금하면 구글링을 하고 여기서는 왜 굳이 .get 함수를 썼는지 생각해보자.

a = {'name':'pey', 'phone':'0119993323', 'birth': '1118'}
>>> a.get('name')
'pey'
>>> a['name']
>>> 'pey'

사실 딕셔너리 자료형에서 위의 두가지 방법 모두 같은 결과를 가져온다.

안에 key값이 있을 경우 는 말이다.

 

만약 a 객체에 없는 key를 출력하라 한다면,

a = {'name':'pey', 'phone':'0119993323', 'birth': '1118'}
>>> print(a.get('nokey'))
None
>>> print(a['nokey'])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 'nokey'

.get 함수는 NONE 을 출력하지만

바로 접근했을 때는 에러를 출력한다.

따라서, 해당 키가 없을 때, 내가 제어할 수 있다는 장점이 있다.

 

또한, 딕셔너리 안에 찾으려는 key 값이 없을 경우 미리 정해 둔 디폴트 값을 대신 가져오게 할 수 있다.

get(x, '디폴트 값') 을 사용하자.

>>> a.get('foo', 'bar')
'bar'

 

그렇기 때문에 .get 을 사용했고,

결국 request.GET.get('page') 는 딕셔너리 자료형에서

key 값으로 value를 가져올 수 있는 방법중 하나이다.

 

그렇다면 역으로 생각했을 때, request 객체로 정보를 보내고 받을때,

이것의 정체는 딕셔너리 형 임도 쉽게 유추할 수 있다!

 

이렇게 통신한다는 것!

2019-03-03 9 29 23

 

그럼 우리가 만들고 난 후 URL을 보면 이렇게 되있을거야.

2019-03-03 9 31 06

 

그렇다면 이제 처음 질문에 대해 완벽한 답을 해보면,

page = request.GET.get('page')

request.GET 중,

page를 key값으로 하는 value(페이지번호)를 반환하여,

page 변수에 담아라!

 

그렇다면 우리는 사용자가 어떤 page에 접속했는지에 대한 정보를 명확하게 가져올 수 있다!

 

페이지를 가져오기

이제 어떤 걸 원하는 지 알았으니까 그 페이지를 찾자.

paginator.get_page(page)

 

html 띄우자

이건 실습에서 해보는 걸로 하자!

Comments