Study/django

django - Answerform

1. 답변등록 폼을 만든다.

  • 답변등록폼은 질문내용하단에 달리게 된다.
<h1>{{ question.subject }}</h1>

<div>
	{{ question.content }}
</div>

<form action = "{% url 'pybo:answer_creat' question.id %}" method="post">
{% csrf_token %}
<textarea name="content" id="content" rows="15"></textarea>
<input type="submit" value="답변 등록">
</form>
  • 원래 장고 개발시 form 데이터를 전송할때는 장고자체의 폼을 이용한다. 지금은 이대로 사용.
  • {% csrf_token %} 는 form 엘리먼트를 통해 전송된 데이터가 실제로 웹브라우저에서 작성된 데이터인지 판단하는 검사기 역할을 한다.
    보안관련 기능이므로 폼을 사용할때는 반드시 함께 넣어주는것이 좋다. 

 

2. 답변등록을 위한 URL을 매핑한다. 

/*--- 생략 ---*/

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'),
]

/*--- 생략 ---*/
  • /pybo/url.py 에 이코드를 등록한다. 
  • form 엘리먼트에서 전송될 /pybo/answer/create/2/ 에 대한 URL매핑이다. 

 

3. views.answer_create 에 해당하는 함수추가, 답변등록이되면 question_detail.html 로 이동하게 해준다.

from django.shorcuts import render, get_object_or_404, redirect
from .models import Question
from django.utils import timezone

/*--- 생략 ---*/
def answer_create(request, question_id):
   """
   답변 등록
   """
   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)
  • 잠시 코드를 분석해보면 pk는 question_id를 넘겨받게되고 request는 form의 textarea에 입련된 답변내용을 넘겨 받는다. 여기서 해당텍스트 내용만을 추출하기위한 코드가 request.POST.get('content') 이다.
  • Question 모델을 통해 Answer 모델 데이터를 생성하기 위해 question.answer_set.create 라는 ORM을 사용한다. 
  • redirect('pybo:detail', question_id=question.id) 를 통해 question_detail.html 로 이동 가능하다.
def answer_creat(request, question_id):
   """
   답변 등록
   """
   question = get_object_or_404(Question, pk=question_id)
   answer = Answer(question=question, content=request.POST.get('content'), 
                   create_date=timezone.now())
   answer.save()
   return redirect('pybo:detail', question_id=question.id)
  • 위와 같이 question.answer_set.create 를 사용하지 않고, Answer 모델을 통해 저장하는것도 가능하다. 

 

4. 답변을 보여주기위해 pybo/question_detail.html 파일에 태그를 수정해준다.

<h1>{{ question.subject }}</h1>

<div>
	{{ question.content }}
</div>

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

<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>
  • localhost:8000/pybo/ 에 접속해서 구현한 기능을 확인해본다. 

 

 

 

 

위 문서는 이지스퍼블리싱에서 출간한 박응용님의 "점프투 장고"를 제가 공부하면서 요약한 내용입니다.
게시한 내용은 공부를 하면서 저만 알아볼 수 있게 요약한 부분들도 많으므로 부족한 내용은
직접 책을 구입하셔서 보시면 좋을 것 같습니다.

 

 

 

'Study > django' 카테고리의 다른 글

django - StandardHTML  (0) 2021.09.26
django - CSS  (0) 2021.09.25
django - Namespace  (0) 2021.09.25
django - QuestionContent  (0) 2021.09.25
django - QuestionTitleList  (0) 2021.09.25