수학과의 좌충우돌 프로그래밍

[Django] 06.pk, path converter, get_object_or_404란? 본문

웹프로그래밍/Django

[Django] 06.pk, path converter, get_object_or_404란?

ssung.k 2019. 2. 24. 16:50

안녕하세요 강민성입니다.


이번에는 저번 시간부터 만들어오던 blog 프로젝트를 좀 더 업그레이드 시켜보도록 하겠습니다.


먼저 업그레이드 내용부터 알아보도록 하겠습니다.


1. 글자 수 제한


2. ...more 에 링크 달기


3. 링크를 클릭했을 때 detail.html 페이지 내보내기


pk, path converter, get_object_or_404란?



글자 수를 제한하기 위해, 그리고 실습 진행을 위해 admin에서 여러 개의 blog 객체를 만들어 놨습니다.



1. 글자수 제한


글자수 제한부터 해보도록 하겠습니다.


글자를 제한하는 건 모델에 함수 하나만 추가해주면 됩니다.


함수를 만들고 본문 내용 body를 슬라이싱을 이용해서 100글자로 제한하였습니다.



그리고 home.html 을 다음과 같이 수정해주었습니다.


전체 본문 내용이 담긴 body 대신 100글자로 제한되어있는 summary 가 담겨있습니다.



결과를 확인해보면 100글자로 제한이 되었습니다.





2. more에 링크달기


다음으로는 본문 내용 맨 뒤에 more을 추가하고 각각의 detail 페이지로 갈 수 있도록 링크를 달아보겠습니다.


아직 링크로 넘어갈 페이지는 만들지 않았으니 href 는 비워두도록 하겠습니다.




2. 링크를 클릭했을 때 detail.html 페이지 내보내기



detail.html 은 100글자로 요약한 내용이 아닌, 전체 내용을 담고 있어야 합니다.


그럼 각 글마다 각각에 해당되는 detail.html 을 만들어주어야 할까요?


그러면 글이 많아질 경우, 수없는 detail.html이 필요할 겁니다.


따라서 하나의 detail.html 만들고 상황에 맞게 내용을 넣어주도록 하겠습니다.


좀 더 자세히 설명을 하자면,


우리는 각 상황에 몇 번째 블로그 객체를 호출하는지를 알아야하고, (pk)


그 상황에 맞는 url 은 .../blog/{객체번호} 처럼 객체에 따라서 달라야 할 것입니다. (path converter)


또한 없는 객체 번호를 호출할 경우에는 에러 페이지를 호출해야 합니다. (get_object_or_404)



먼저 url 부터 설계해보도록 하겠습니다.


기존의 url 과 다른 점이 있다면 <int:blog_id> 부분입니다.


이 부분을 바로 path converter 라고 부르는데 이를 통해


여러 객체들을 다루는 계층적인 url을 자동으로 쉽고 편하게 생성할 수 있습니다.


기존의 url 은 숫자를 쓰더라도 str 타입으로 인식을 하는데 <>와 int를 통해 정수형으로 바꿔줍니다.


다음의 url 로 접속시 blog_id를 views 에 detail 함수로 넘겨주게 됩니다.




이제는 views 에 detail 함수를 정의해보겠습니다.


기존에는 request 만 들어오면 바로 html 파일을 넘겨주는 방식으로 가능했지만.


이번에는 몇 번째 객체인지도 결정해주어야 하므로 blog_id 도 파라미터로 받아야 합니다.


다음으로는 blog_id 에 해당하는 객체를 가지고 와야합니다.


기존처럼 objects 로 가져오게 되면 모든 객체를 가져오기 때문에 다른 메소드를 사용하겠습니다.


바로 get_obejct_or_404 입니다. 위에서 imort를 먼저 해주고,


이 메소드는 두 개의 인자를 받게 되는데


첫번째로 어떤 클래스에서 객체를 가져올지, 두번째로 앞의 클래스의 몇번째 객체인지를 결정하게 됩니다.


그리고 몇 번째 객체인지는 pk(primary key) 를 사용하게 됩니다.


pk 는 각 객체를 구분해주는 역할을 합니다.




이제 detail.html 만 만들어주면 완성입니다.


내용을 넣어주고 home.html 에서 detail.html로 연결 링크를 채워보겠습니다.


기존의 방식과 다른 점은 뒤에 blog.id를 추가해주면


첫번째 ... more을 클릭 시 원하는 상세페이지가 나오는 것을 확인할 수 있습니다.



마무리



오늘 배운 내용은 굉장히 활용도가 높습니다.


잘 숙지해서 요긴하게 써먹으시길 바랍니다.



Comments