답변 등록 기능

Red_Panda·2021년 3월 15일
0

이제는 질문 리스트를 볼 수 있다. 그래서 질문 리스트 페이지에 접속해 답변 다는 기능을 만든다.

답변 등록 버튼


질문 상세 페이지인 question_detail.html 파일에 답변버튼 form을 만들어줬다.
답변 저장 URL은 form의 action 속성에 지정된 url_for 함수를 이용한 아래 코드가 알려준다.

"{{ url_for('answer.create', question_id=question.id) }}"

method="post"는 답변등록 버튼 클릭시, POST 방식으로 form의 action 속성에 등록된 URL이 호출된다.

POST, GET 방식들은 서버에 요청하는 메서드다.
가장 큰 차이로 POST 방식은 데이터를 BODY에 담아 보내고, GET 방식은 데이터를 URL 뒤에 붙여서 보낸다.

코드 추가 후, 질문 상세 페이지에 접속시 answer.create에 해당하는 주소가 존재하지 않아 오류가 발생한다.

답변 블루프린트

질문 모델과 마찬가지로 답변 모델을 관리하는 블루 프린트도 만들어야 한다. views 디렉토리 안에 answer_views.py 파일을 생성해 만들자.

create함수의 매개변수 question_id는 URL에서 전달된다.
페이지 주소가 answer/create/n/ 일때, question_id값에는 n이 들어온다.
@bp.route의 method 속성은 연결할 form 엘리먼트와 같은 값으로 해야 오류가 발생하지 않는다.

form 엘리먼트를 통해 얻은 데이터들은 create 함수에서 request 객체로 얻는데, 위 코드는 얻은 데이터 항목 중 name값이 'content'인 값을 지정했다.

question.answer_set은 예전 답변 모델을 만들때 작성했던 부분이다. 질문 모델과 답변 모델이 연결 되어 있어 backref(역참조)의 answer_set을 사용할 수 있다. append를 이용해 답변 목록들을 answer_set에 하나씩 추가해준다.

redirect 함수를 이용하여 답변 생성 후 question_detail로 이동하도록 했다. redirect 함수 내 question_id는 question_views.py의 detail 함수의 매개변수로 전달된다.

request 객체 : 브라우저에서 요청한 정보를 확인가능

블루프린트 적용

생성한 answer_views.py를 __init.py__에 등록한다. 여태 등록했던 방식이랑 똑같다.
answer_views.py의 bp.route 메서드는 methods다. s를 빼먹으면 오류난다.

이제 답변 버튼이 보인다. 답변등록버튼이 기능하도록 question_detail.html파일에 코드를 추가한다.


question.answer_set의 길이는 답변의 개수, answer_set에서 각 요소들은 하나의 답변을 의미한다. for문을 이용해 answer_set에서 요소를 하나씩 꺼내어 answer.content를 출력해줬다.

이제 답변 내용을 쓰고, 답변등록을 누르면 답변이 생긴다. 신기하다.

다음은 보기 편하게 페이지 디자인을 꾸민다.

profile
신입 개발자

0개의 댓글