django | 11. 답변 CREATE

sojung·2021년 6월 16일
0

django

목록 보기
12/21
post-thumbnail

form 만들기

<!-- home/question_detail.html -->

<form action="{% url 'home:answer_create' a_question.id %}" method="post">
  {% csrf_token %}
  <textarea name="content" id="content" cols="30" rows="10"> </textarea>
  <input type="submit" value="답변 등록" />
</form>

답변 등록을 누를 때 호출되는 URL은 action 속성에 있는 URL이다.
home앱의 answer_create라는 경로로 이동하라. (아직 안만듦)

{% csrf_token %}
form 엘리먼트를 통해 전송된 데이터(답변)가 실제로 웹 브라우저에서 작성된 데이터인지 판단하는 검사기 역할. 올바르지 않은 방법으로 데이터가 전송되면 서버에서 발생한 csrf_token값과 해커가 보낸 csrf_token값이 일치하지 않으므로 오류를 발생시켜 보안을 유지할 수 있다.


경로 만들기

이제 urls.py에 answer_create라는 경로의 URL을 매핑해주자.

# home/urls.py

urlpatterns = [
  ...
  path('answer/create/<int:question_id>', answer_create, name="answer_create"), # question_id에 숫자가 mapping되었다. 
]

함수 만들기

데이터를 저장할 함수를 만들자.

# home/views.py

from django.shortcuts import render, get_object_or_404, redirect # redirect import 해준다.

...

def answer_create(request, question_id):
  a_question = get_object_or_404(Question, pk=question_id) # 어떤 question 글에 달린 answer?
  a_content = request.POST.get('content') # 뒤에 content는 html>name이랑 같다
  question.answer_set.create(content = a_content) # models.py = views.py
  return redirect('home:question_detail', question_id=a_question.id)
  • answer_create 함수의 question_id 매개변수에는 URL 매핑 정보값이 넘어온다.
  • request 매개변수에는 textarea에 입력된 데이터가 파이썬 객체에 담겨 넘어온다. 이 값을 추출하기 위한 코드가 바로 request.POST.get('content')이다. POST 형식으로 전송된 form 데이터 항목 중 name이 content인 값을 의미한다.
  • Question 모델을 통해 Answer 모델 데이터를 생성하기 위해 question.answer_set.create를 사용했다.
  • 답변을 생성한 후 상세 화면을 호출하기 위해서 redirect함수를 사용하였다. 함수에 전달된 값을 참고하여 페이지 이동을 수행하는 함수로서, 첫 번째 인수에는 이동할 페이지의 별칭, 두 번째 인수에는 해당 URL에 전달해야 하는 값을 입력한다.

Answer 모델을 통해 데이터를 저장할 수 있다.
위의 코드는 Answer 모델 데이터 저장을 위해 Question 모델을 사용했다. 하지만 Answer 모델을 직접 사용해도 Answer 모델 데이터를 저장할 수 있다.

def answer_create(request, question_id):
  a_question = get_object_or_404(Question, pk=question_id) # 어떤 question 글에 달린 answer?
  a_content = request.POST.get('content'), # 뒤에 content는 html>name이랑 같다
  Answer.objects.create(question = a_question, content = a_content), # models.py = views.py
  return redirect('home:question_detail', question_id=a_question.id)

등록된 답변 표시하기

<!-- home/question_detail.html -->

...

<h5>{{ a_question.answer_set.count }}개의 답변이 있습니다.</h5>
<div>
  <ul>
    {% for answer in a_question.answer_set.all %}
    <li>{{ answer.content }}</li>
    {% endfor %}
  </ul>
</div>

...

profile
걸음마코더

0개의 댓글