#7 템플릿(Template)
1. pybo 페이지
접속 가능한 로컬 서버와 데이터를 나타낼 모델까지 준비가 끝났으니 이제 실제로 서버에 접속한 사용자에게 데이터를 보여줄 차례이다.
pybo\views.py 의 내용을 위와 같이 수정한다. Question 데이터를 생성 날짜순으로 내림차순 정렬한 뒤 pybo\question_list.html 이라는 템플릿으로 넘겨주고 그 결과를 렌더링하여 웹상에서 보여주겠다는 내용이다.
이제 데이터를 넘겨줄 템플릿을 실제로 만들어야한다. 우선 템플릿들을 저장할 templates 디렉토리를 mysite 디렉토리 하위에 생성한다. pybo 디렉토리 내에 templates 디렉토리를 생성해도 되고 그렇게하면 별도의 설정없이도 django에서 템플릿 디렉토리로 인식하지만 여러 앱이 공유하는 템플릿의 위치 문제등을 고려하면 화면을 구성하는 템플릿들은 하나의 디렉토리에 모아두는게 좋다고 한다. 그러니 여기서는 mystie 하위에 templates 디렉토리를 생성하고 그 내부에 각 앱들의 템플릿을 모아둘 디렉토리를 생성한 뒤 config\settings.py에서 템플릿 디렉토리로 등록해준다.
templates\pybo\question_list.html 을 위와같이 수정한다. html코드 사이에 들어간 중괄호로 둘러쌓인 코드를 템플릿 코드라 한다. 이처럼 HTML태그와 템플릿 코드를 혼용하여 작성한 파일을 템플릿이라 한다. python의 문법을 아는 사람이라면 템플릿코드의 의미는 어렵지않게 이해할 수 있다. 위의 템플릿의 경우 question_list가 비어있지 않다면 question_list 내의 question들을 하나씩 순회하며 각 question의 id번호에 매칭되는 url을 하이퍼링크로 가지는 텍스트를 리스트형태로 보여주는 것이다. 텍스트의 내용은 각 question의 제목이 된다. 만약 question_list가 비어있다면 "질문이 없습니다." 라는 메시지가 출력된다.
이제 localhost:8000/pybo/ 에 접속하면 위와 같이 저장한 question 들이 리스트의 형태로 표시된다.
2. Question Detail
pybo 페이지에서 각 question들에 걸린 하이퍼링크를 따라가면 당연하게도 에러가 발생한다. 하이퍼링크의 url은 ~/pybo/{id번호} 의 형태로 되어있는데, 우리는 아직 그런 페이지의 url 매핑을 해주지 않았기 때문이다.
pybo\urls.py 를 위와 같이 수정한다. pybo/{question_id} 형태의 url에 대해 pybo\views.py의 detail 메소드를 매핑한 것이다.
다음으로 pybo\views.py에 detail 메소드를 추가해준다. question_id는 url 매핑시에 저장된 question_id가 전달된다.
get_object_or_404는 Question.get() 을 호출한 것과 같은 기능이지만 찾으려는 모델이 존재하지 않을 경우 get을 사용하면 500에러가 발생하는데 비해 get_object_or_404는 404에러(page not found)를 일으킨다. 없는 데이터를 요청했을 때의 에러는 404페이지가 출력되는 것이 바람직하기에 get_object_or_404쪽을 쓰기로한다. pk는 primary key, 즉 모델의 기본키를 의미한다.
마지막으로 detail 에서 렌더링할 pybo\question_detail.html 템플릿을 위와같이 작성한다. 매우 간단하게 질문의 제목과 내용만을 표시하는 템플릿이다.
이제 pybo 페이지에서 질문글을 클릭하면 질문의 제목과 내용을 볼 수 있다.