✏️

02-6 답변 등록 기능 만들기 본문

ETC./Do it! 점프 투 장고

02-6 답변 등록 기능 만들기

콩세 2022. 10. 13. 15:35

앞에서 질문 등록, 조회 기능을 만들었고, 이번에는 답변 등록과 답변을 보여주는 기능을 만들어 보자.

 

답변 저장하고 표시하기

 

01단계 질문 상세 템플릿에 답변 등록 버튼 만들기

 

질문 상세 템플릿 pybo/question_detail.html 파일을 수정하자.

form 엘리먼트 안에 textarea 엘리먼트와 input 엘리먼트를 포함시켜 답변 내용, 답변 등록 버튼을 추가하자.

pybo/question_detail.html

<답변 등록> 버튼을 누를 때 호출되는 URL은 action 속성에 있는 {% url 'pybo:answer_create' question.id %} 이다.

 

그리고 form 엘리먼트 바로 아래에 있는 {% csrf_token %} 은 보안 관련 항목이다.

- form 엘리먼트를 통해 전송된 데이터(답변)가 실제로 웹 브라우저에서

   작성된 데이터인지 판단하는 검사기 역할을 한다.

- form 태그 바로 밑에 항상 입력해줘야 한다.

- 해킹처럼 올바르지 못한 방법으로 데이터가 전송되면

   서버에서 발행한 csrf_token값과 해커가 보낸 csrf_token값이 일치하지 않으므로

   오류를 발생시켜 보안을 유지할 수 있다.

 

장고 개발 시 form 데이터를 전송할 때는 보통 장고의 폼을 이용한다.

장고의 폼을 이용하는 방법은 조금 더 공부한 후 설명하겠다.고 책에 써있음.


02단계 질문 상세 페이지에 접속해 보기

 

1단계 후 /pybo/2/ 에 접속해보자

'answer_create' 를 찾을 수 없다는 오류 화면이 나타난다.

1단계에서 입력한 form 엘리먼트의  action 속성에 있는

{% url 'pybo:answer_create' question.id %} 에 해당하는 URL 매핑어 없기 때문이다.


03단계 답변 등록을 위한 URL 매핑 등록하기

 

pybo/urls.py 파일에 답변 등록을 위한 URL 매핑을 등록하자.

이 코드는 사용자가 상세 화면에서 <질문 답변> 버튼을 눌렀을 때 작동할 form 엘리먼트의

/pybo/answer/create/2/ 에 대한 URL 매핑을 추가한 것이다.


04단계 answer_create 함수 추가하기

 

form 엘리먼트에 입력된 값을 받아 데이터베이스에 저장할 수 있도록

answer_create 함수를 pybo/views.py 파일에 추가하자.

answer_create 함수의 question_id 매개변수에는 URL 매핑 정보값이 넘어온다.

예를 들어 /pybo/answer/create/2 가 요청되면 question_id에는 2가 넘어온다.

 

request 매개변수에는 pybo/question_detail.html에서 textarea에 입력된 데이터가 파이썬 객체에 담겨 넘어온다.

이 값을 추출하기 위한 코드가 바로 request.POST.get('content')이다.

- request.POST.get('content')는 POST 형식으로 전송된 form 데이터 항목 중 name이 content인 값을 의미한다.

 

그리고 Question 모델을 통해 Answer 모델 데이터를 생성하기 위해 question.answer_set.create를 사용했다.

- Answer 모델이 Question 모델을 Foreign Key로 참조하고 있으므로 question.answer_set 같은 표현을 사용할 수 있다.


05단계 답변 등록 후 상세 화면으로 이동하게 만들기

 

답변을 생성한 후 상세화면으르 호출하려면 redirect 함수를 사용하여 코드를 작성화면 된다.

redirect 함수는 함수에 전달된 값을 참고하여 페이지 이동을 수행한다.

redirect 함수의 첫번째 인수에는 이동할 페이지의 별칭을,

두 번째 인수에는 해당 URL에 전달해야 하는 값을 입력한다.

 

질문 상세 페이지에 다시 접속해보면

답변을 등록할 수 있는 창과 <답변 등록> 버튼이 보인다.

텍스트 입력 창에 아무 내용이나 입력하고 <답변 등록> 버튼을 누르면 아무 변화가 없다.

아직 등록한 답변을 표시하는 기능은 추가되지 않았기 때문이다.


06단계 등록된 답변 표시하기

 

질문 상세 화면에 답변을 표시하려면 pybo/question_detail.html 파일을 수정해야 한다.

question.answer_set.count 는 답변 개수를 의미한다.

질문 내용과 답변 입력 창 사이에 답변 표시 영역을 추가했다.

 

코드를 위처럼 수정한 후에 질문 상세 페이지에 접속하면 다음과 같은 화면을 볼 수 있다.

 

 

 

 

 

 

 

 

5단계에서 텍스트 박스에 아무 말이나

적었던 '몰라' 가

나타나 있는 것을 확인 할 수 있다.

 

 

 

 

 

 

 

 

 

 

 

 

이렇게 파이보의 답변 저장, 답변 조회 기능을 완성했다.