페이지 요청을 통해서 데이터를 저장하는 방법
상세조회 화면에 답변을 입력할 수 있는 텍스트창(textarea)을 생성하고 "답변등록"이라는 버튼을 생성하여 답변(Answer) 데이터를 저장
<form action="{% url 'pybo:answer_create' question.id %}" method="post">
{% csrf_token %}
<textarea name="content" id="content" rows="15"></textarea>
<input type="submit" value="답변등록">
</form>
텍스트 창, 등록 버튼 추가.
{% csrf_token %}
: 보안 관련. 실제 웹페이지에서 작성된 데이터인지를 판단. form 태그 밑에 써주는게 좋음.
urlpatterns = [
path('', views.index, name='index'),
path('<int:question_id>/', views.detail, name='detail'),
path('answer/create/<int:question_id>/', views.answer_create, name='answer_create'),
]
def answer_create(request, question_id):
"""
pybo 답변등록
"""
question = get_object_or_404(Question, pk=question_id)
question.answer_set.create(content=request.POST.get('content'), create_date=timezone.now())
return redirect('pybo:detail', question_id=question.id)
request.POST.get('content')
: POST로 전송된 폼(form) 데이터 항목 중 content의 값을 의미
question.answer_set
: 질문의 답변. Question과 Answer 모델은 서로 ForeignKey 로 연결되어 있기때문에 이처럼 사용할 수 있다.
redirect
함수 : 페이지 이동을 위해 장고가 제공하는 함수. 답변 저장 후 pybo:detail 페이지로 이동
페이지에서 답변 등록할 수 있음.
화면에 답변 표시하기
<h5>{{ question.answer_set.count }}개의 답변이 있습니다.</h5>
<div>
<ul>
{% for answer in question.answer_set.all %}
<li>{{ answer.content }}</li>
{% endfor %}
</ul>
</div>