| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 7 | 8 | 9 | 10 | 11 | 12 | 13 |
| 14 | 15 | 16 | 17 | 18 | 19 | 20 |
| 21 | 22 | 23 | 24 | 25 | 26 | 27 |
| 28 | 29 | 30 | 31 |
- notion
- 소수출력
- 별찍기
- 점프투장고
- Django
- 동일성 연산자
- pycharm
- mutate()
- 멤버십 연산자
- javascript
- sd()
- 자료형
- summarise()
- COUNT()
- Swift
- group_by()
- R 데이터 분석
- sqldf
- ReactNative
- while
- input함수
- python
- react
- vs code
- 반복문
- 제어문
- 조건문
- f-string
- match case
- inflearn
- Today
- Total
✏️
02-6 답변 등록 기능 만들기 본문
앞에서 질문 등록, 조회 기능을 만들었고, 이번에는 답변 등록과 답변을 보여주는 기능을 만들어 보자.
답변 저장하고 표시하기
01단계 질문 상세 템플릿에 답변 등록 버튼 만들기
질문 상세 템플릿 pybo/question_detail.html 파일을 수정하자.
form 엘리먼트 안에 textarea 엘리먼트와 input 엘리먼트를 포함시켜 답변 내용, 답변 등록 버튼을 추가하자.

<답변 등록> 버튼을 누를 때 호출되는 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단계에서 텍스트 박스에 아무 말이나
적었던 '몰라' 가
나타나 있는 것을 확인 할 수 있다.
이렇게 파이보의 답변 저장, 답변 조회 기능을 완성했다.
'ETC. > Do it! 점프 투 장고' 카테고리의 다른 글
| 02-5 URL 더 똑똑하게 사용하기 (0) | 2022.10.13 |
|---|---|
| 02-4 질문 목록과 질문 상세 기능 구현하기 (0) | 2022.10.13 |
| 02-3 개발 편의를 제공하는 장고 Admin (0) | 2022.10.12 |
| 02-2 데이터를 관리하는 모델 (0) | 2022.10.12 |
| 02-1 주소와 화면을 연결하는 URL과 뷰 (0) | 2022.10.10 |