1. 답변등록 폼
질문글 리스트와 질문글 상세 페이지까지 구현이 끝났으니 드디어 질문 글에 답변을 등록하는 기능을 만들 차례이다.
먼저 답변을 등록하기 위한 폼(form)을 추가해야한다. 답변은 질문 상세 페이지에서 댓글처럼 등록할 수 있도록 할
것이기 때문에 질문 상세 페이지(question_detail.html)에 다음과 같이 폼을 추가한다.
form 태그의 action 속성은 form 태그 내에서 입력받은 데이터를 전송할 url과 전송 방식(get or post)을
지정한다. 여기서는 pybo 앱의 answer_create 라는 별칭의 url을 데이터를 전송할 url로, 전송 방식은 post로
지정하였다.
{% csrf_token %} 은 보안을 위한 코드이다. 제출된 form 이 실제 웹페이지에서 작성한 데이터가 맞는지를
가늠하기 위해 서버에서 발행한 토큰값과 비교하고 만약 비정상적인 방법으로 제출된 데이터라면 토큰이
일치하지 않아 오류가 발생할 것이다. form 태그에서 입력받는 모든 정보에 대해 보안을 보장하기 위해 form 태그
바로 아래에 이 코드를 위치시켜야 한다.
text_area 태그는 답변의 내용을 작성할 텍스트 영역이다. 여기서는 이름을 content(내용)로 지정하고 최대
15줄까지 보여지도록 설정한다. 지정한 줄 수를 넘어가면 텍스트 영역은 자동으로 스크롤 바를 생성한다.
(15줄 이상 입력하지 못하는 것이 아니다.)
input 태그는 type 속성에 따라 여러 형태로 사용자의 입력을 받아들이기 위한 태그이다. 여기서는 답변의
내용을 제출하기 위한 submit 속성으로 지정하였다. submit 속성의 버튼이 클릭되면 지금까지 form 에 입력된
모든 데이터는 action 속성에 지정된 url로 지정된 전송 방식에 따라 전송된다.
2. URL 매핑, 뷰 함수 추가
물론 위의 작업만을 수행하고 웹페이지에 접속하면 에러가 발생한다. action 태그에 pybo:answer_create 라는
url 별칭을 사용했지만 그런 url 매핑은 등록해두지 않았기 때문이다.
pybo/urls.py 에서 다음과 같이 url 매핑을 추가한다.
pybo:answer_create 을 추가해두었으니 이제 url 매핑 문제는 해결했다. 그러나 이번에는 뷰 함수에
answer_create 라는 함수가 존재하지 않는다. 이 또한 추가해줄 필요가 있다.
pybo/views.py 에 다음과 같이 timezone 모듈을 import 하고 answer_create 함수를 추가해준다.
먼저 question = get_object_or_404(Question, pk=question_id) 로 답변을 등록할 질문 객체를 가져온다.
그 다음 question 의 answer_set에서 form에서 POST 방식으로 전송받은 데이터중 content에 해당하는 것을
내용으로, timezone 모듈로 얻은 현재시각을 생성 시간으로 하여 새로운 답변을 생성한다. 물론, Answer 모델을
직접 사용하여 답변을 등록할 수도 있다. 과정만 다를 뿐 결과는 동일하다. 답변 등록이 완료되면 redirect를
호출하여 답변을 등록한 질문의 상세페이지로 돌아간다.
여기까지 완료되었다면 다음과 같이 질문 상세페이지에서 답변 등록 폼이 보이며 답변의 등록 또한 가능하다.
하지만 아직까지는 답변을 등록해도 변하는 것이 없다. 등록된 답변을 보여주는 기능을 질문 상세 페이지에
추가하지 않았기 때문이다.
3. 답변 조회
이제 질문 상세 페이지에 현재 질문에 달린 답변을 모두 보여주는 기능을 추가한다.
templates/pybo/question_detail.html 를 다음과 같이 수정한다.
question.answer_set 에 담긴 답변의 갯수와 각 답변의 내용을 보여주는 코드를 추가한 것을 알 수 있다.
여기까지 완료되었다면 다음과 같이 등록한 답변이 질문 상세페이지에 출력된다.
'개인 프로젝트 > Django-mysite' 카테고리의 다른 글
#11 부트스트랩(Bootstrap) (0) | 2021.09.22 |
---|---|
#10 스타일시트(Style Sheet) (0) | 2021.09.22 |
#8 URL과 네임스페이스 (0) | 2021.09.21 |
#7 템플릿(Template) (0) | 2021.08.16 |
#6 django admin (0) | 2021.08.16 |