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 |