URL 별칭을 통해 하드코딩을 없애주고, 질문등록과 조회기능을 구현했다.
이제 답변기능을 구현해보자.
답변기능은 question_detail.html파일을 수정하자.
<h1>{{ question.subject }}</h1>
<div>
{{ question.content }}
</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>
답변등록을 통해 pybo:answer_create URL이며, question.id도 같이 보내준다.
( 아직 구현 전이다. )
form은 html에서 데이터를 모아주는 보자기라고 생각하면 된다.
이 form 안에 답변 내용을 담을 textarea를 만들어주고, 등록버튼을 통해 action에 있는 URL로 제출한다.
여기서 {% csrf_token %} 을 볼 수 있는데, 이 구문은 작성되서 전달하는 form이 실제로 웹 브라우저에서 작성되었는지
확인해주는 일종의 보안 코드라고 생각하면 된다.
이제 answer_create를 만들러 가보자.
이쯤되면 pybo/urls.py로 손이 갈 것이다.
path('answer/create/<int:question_id>/',views.answer_create,name = 'answer_create'),
이 한줄만 추가해주자.
함수는 views의 answer_create로 연결되며, 이름은 answer_create이다.
pybo/views.py에서 answer_create를 만들어주자.
# pybo/views.py
from django.shortcuts import render, get_object_or_404,redirect # 404일 경우 ,페이지 이동
from django.utils import timezone
...
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)
...
detail에서와 마찬가지고 Question을 404에 담고 pk에 question_id 를 담아준다. 데이터베이스에 존재하지 않는 데이터가 들어가면
404페이지를 뱉는다.
request에는 question_detail.html에서 작성된 textarea가 전달되고, 이를 추출하기 위해서 request.POST.get('content')를 사용한다.
create_date 는 현재시간을 담아준다.
모두 작성하고나면 이동할 페이지를 redirect를 이용하여 정해준다.
답변 등록을 누르면 다시 원래 화면으로 돌아간다.
답변 등록에서 작성된 답변들도 볼 수 있게 해보자.
<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>
question.answer_set.count 는 answer의 갯수를 반환해준다.
그리고 set.all을 이용해서 list형태로 불러오고, 반복을 통해 하나씩 출력해준다.
짠
'python > Django' 카테고리의 다른 글
[Django] 10 . 표준 HTML으로 만들기 (0) | 2021.12.28 |
---|---|
[Django] 9. 부트스트랩을 적용시키자. (0) | 2021.12.27 |
[Django] 7. URL 네이밍하기 (0) | 2021.12.23 |
[Django] 6-1. 404는 어떻게 대처할까 (0) | 2021.12.22 |
[Django] 6. 장고 템플릿 구현 (0) | 2021.12.22 |