<!-- 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)
request.POST.get('content')
이다. POST 형식으로 전송된 form 데이터 항목 중 name이 content인 값을 의미한다.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>
...