2020.10.05_django 페이징구현_정리노트
와씨.....간만포스팅 추석 연휴동안은 진짜 코드안보고 방탕하게 살았다...
이제 다시 열일해서 다시 열시미 포스팅해야지
오늘은 예ㅔㅔㅔ전에 했던 게시판 만들기에서 내가 하나의 페이지 당 몇개를 띄워주고 나머지는 다음 페이지로 넘기는 것을 해볼 예정쓰
증맬 이것저것 구글링하고 뭔 말인가 그냥 넣어보고 오만가지 다하다가..ㅎ ..결국 공식문서가 최고라는 것을 다시금 되새기며 포스팅 ㄱㄱㄱ!!!
오늘은 장고에서 기본적으로 페이징을 할 때 쓰는 기능인 Paginator를 쓸 예정! 여러가지 보다보니까 진짜 너무 간단해서 세삼 너무 감동스러웠... 최고
장고에서 제공하는 paginator 는 클래스 기반, 뷰에서 작성하는 함수 두가지로 모두 나와있다...! 나는 오늘 뷰 기반으로 쓸거고, 클래스 기반 뷰에서 작성하는 거는 공식문서로 가서 확인해서 쓰면 될듯! 확실히 클래스 기반뷰가 더 간단하도라.. 나도 다른 게시판 뷰에서는 이렇게 쓸테다 후..
쩃든 여기서 보면 장고에서 paginator 를 불러와주고, 내가 만든 모델을 불러와서 오브젝트들을 가지고 오게 해놨다.
그래서 내프로젝트에 적용을 하면,
이렇게 적용을 했다. 여기서 중간에 내가 추가한 모델 메소드가 있는데 잠시 정리정리
order_by()
데이터를 키에 따라 정리 할 수 있는 기능. 앞에 - 가 붙으면 내림차순
여기서는 그래서 내가 생성한 오브젝트의 고유 번호 pk 에 따라서 내림차순하여, 최신글이 맨 위에 위치하도록 추가로 옵션을 넣어주었다!
또한 기본으로 장고에서 제공되는 옵션들을 통해서 공식문서랑 똑같이 넣어주었음 ㅎㅁㅎ
여기서 하나 또 짚고 넘어갈 점은 장고공식문서에서의 오브젝트 기본은 all() 로 되어있지만, 나는 여기서 다른 옵션들을 많이 넣어주었기 때문에 될까 하고 paginator의 세부 옵션에 들어가보았는데,
거기서 보면, Paginator.object_lists는 필수이고, 리스트, 튜플등 슬라이스가 가능한 객체기만 하면 된다는 군녀
나는 filter 를 써서 객체들을 쿼리셋 리스트로 들고 와서 사용이 가능함 >>> get 쓰면 안된다는 얘기.
뭐 물론 카테고리가 자유게시판인 오브젝트들이 여러개라 짜피 get 을 쓰게 되면 이미 저기서 부터 에러가 나더라.
이렇게! get 이 두개 이상의 Post 를 가지고 와서 16을 리턴해주었다! 라고 뜸.
get 과 filter 가 뭔지는 이 포스팅
get,filter, order_by 모두 장고 모델 api 에서 제공하는 기본 쿼리 메소드들임
나중에 안 사실이지만 우리는 더이상 이제 free_post_list 는 필요없어서 굳이 들고와주지 않아도 됨..그 이유는 밑에서 설명하겠삼
이제 템플릿상에서 띄워줘야하니 해당 html로 ㄲ
이제는 이렇게만 템플릿상에 보기 좋게 띄워주면 된다.
has_previous 나 has_next 도 장고에서 기본적으로 제공되는 기능... 머싯다..
쨋든 얘가 해주는 것은 이전 페이지는 어떻게 띄워줄지, 현재 페이지는 어떻게 말해줄지, 다음페이지는 마찬가지로 어떻게 해줄지이다.
first 와 last 옆에 있는 이상한 기호는 html 특수 기호를 표현하는 거라구.. 하네여 >>>이거임.
이제 내프로젝트로 적용
이 템플릿 태그들은 우리가 띄워놓은 글 밑에다가 그냥 툭 붙여주기만 하면 된다.
나는 다 쉽게 직관적으로 ㅎ.. 한글로 바꿔주고 class 이름도 조금 만져주고 현재 페이지에서는 원래 공식 문서대로라면
현재 페이지 of 전체페이지 이런식으로 뜨게 설정해주었는데, 나는 그냥 현재 어디 페이지라는 것만 알려주었다.
이렇게 하면,
오오오오오 잘 된다아!!!!!! ( 원래는 맨 왼쪽으로 가야하지만 임시로 그냥 안보여서 css 대충 중앙정렬해줬음 )
근데 뭔가 이상함.. 왜냐 위를 주욱 훑어 보면 내가 적어준 전체글이 1페이지든 2페이지든 나타남.. 즉 나는 지금 자유게시판에는 총 16개 글을 적어주었는데, 1페이지든 2페이지든 16개가 뜬다.. 내가 설정한 10개만 보여주기가 안나타나ㅠㅠㅠㅠㅠㅠ
그래서
친절하게 장고에서는 또 예시로 각 요소에 대한 뜻을 이렇게 print 로 설명해줘서 나도 뷰에서 하나하나 print 해서 잘 작동하는지 봤는데 뷰에서는 전부 잘 작동함... 후 그리고 에러가 안뜨는 것 또한 기능적으로는 문제가 없으니,
내가 템플릿상에서 띄워준게 잘못되었던 것.
계속 저기서 답을 찾을게 아니라 나는 여기서 찾았어야 했음 여기서 내가 뭘 띄워주고 있냐.
이걸 계속 띄워주고 있었던 거임... 아까 그래서 딕셔너리 값도 빼준 이유가 여기서 보이는데, 우리는 페이징을 사용하면서 얘는 그냥 조건에 맞는 애들의 오브젝트들이었던 거지, 페이지 오브젝트들이 아니었다...
이거 생각하는데 한참 걸림 후.. ㅎ 그러니 포스팅에도 적겠다 그러니 띄워주는 오브젝트들을
그러니 얘도 페이지 오브젝트들로 바꿔줍씨다 ! 그렇게 하면,
잘 뜨게 됨 짝짝 캡쳐에는 전체가 안담겼지만, 10개 잘뜨고 밑에도 잘 작동한다!!!!!!!!!
휴우 오늘은 또 이렇게 적으니 간단하지만 어려운 글 몇개 봐서 시간도 많이 날림 ㅎ 그래도 머 여러가지도 많이 알고 공식문서.......필독이라는 교훈도 얻었으니 간만에 또 포스팅 적고 뿌듯하게 자겠삼
포스팅 끝!
'django' 카테고리의 다른 글
2020.11.08_django_category 자동 넘겨주기 (0) | 2020.11.09 |
---|---|
2020.10.07_django 검색 기능 구현하기 (2) | 2020.10.08 |
2020.09.27_django_댓글 수정,삭제, 대댓글 (0) | 2020.09.28 |
2020.09.23_django_좋아요 기능 구현 (0) | 2020.09.24 |
2020.09.19_django_class CRUD (0) | 2020.09.19 |
댓글