본문 바로가기
IT

[프로그래밍] Chap 2. 장고 기본 요소 학습#6 (게시판 답변 등록 기능)

by 밤고래 2021. 6. 1.
반응형

안녕하세요. 밤고래에요 :)

앞에서는 질문 등록, 조회 기능을 만들었어요.

 

 

[프로그래밍] Chap 2. 장고 기본 요소 학습#4 (장고 Admin, 템플릿, 예외페이지)

안녕하세요. 밤고래에요 :) 오늘은 장고 Admin 과 템플릿에 대해서 알아볼 예정입니다. Admin 이란, 저희가 만든 웹 어플리케이션의 관리자페이지라고 생각하면됩니다. 템플릿 이란, 장고 문법을 사

bamgorae.tistory.com

 

이번에는 파이보 게시판 앱에 답변을 등록하는 기능을 구현해볼 예정입니다.

 

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

[실습] 답변 저장하고 표시하기(p91)

Step 1. 질문 상세 템플릿에 답변 등록 버튼 만들기

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

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

 

 

 

 

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

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

{% csrf_token %} 는 form 엘리먼트를 통해 전송된 데이터(답변)가 실제로 웹 브라우저에서 작성된 데이터인지 판단하는 검사기 역할을 한다. 그러므로 <form ...> 태그 바로 밑에 {% csrf_token %} 을 항상 입력해야한다.

해킹처럼 올바르지 않은 방법으로 데이터가 전송되면 서버에서 발생한 csrf_token값과 해커가 보낸 csrf_token 값이 일치하지 않으므로 오류를 발생시켜 보안을 유지할 수 있다.

 

Step 2. 질문 상세 페이지에 접속해보기

1단계를 마치고 pybo/2 에 접속해보면 answer_create를 찾을 수 없다는 오류 화면이 나타난다.

 

 

 

 

Step 3. 답변 등록을 위한 URL 매핑 등록하기

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

 

 

 

 

이 코드는 사용자가 상세 화면에서 <질문답변> 버튼을 눌렀을 때 작동할 form 엘리먼트의 /pybo/answer/create/2/에 대한 URL 매핑을 추가한 것이다. 

 

Step 4. 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')이다.

 

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

그런데 Question 모델에는 answer_set 이라는 속성이 정의되어있지않은데 어떻게 사용할 수 있을까?

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

 

 

 

 

Step 5. 답변 등록 후 상세화면으로 이동하게 만들기

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

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

redirect 함수의 첫번째 인수에는 이동할 페이지의 별칭, 두번째 인수에는 해당 URL에 전달해야 하는 값을 입력한다.

 

 

 

질문 상세 페이지에 다시 접속해 보자. 그러면 다음처럼 답변을 등록할 수 있는 창과 <답변등록> 버튼이있다!

 

 

 

 

텍스트 창에 아무 값이나 입력하고 <답변 등록>을 눌러보자.

아마 아무런 변화가 없을 것이다. 왜냐하면 아직 등록한 답변을 표시하는 기능을 추가하지 않았기 때문이다.

 

Step 6. 등록된 답변 표시하기

위 5단계에서 나오는 페이지는 pybo/question_detail.html 파일이다.

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

 

 

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

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

 

 

 

 

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

 

반응형

댓글