python/Django

[Django] 8. 답변기능 구현

끼발자 2021. 12. 23. 16:08
반응형

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형태로 불러오고, 반복을 통해 하나씩 출력해준다.

 

반응형