[Python] django 데이터 저장
본문 바로가기

[Python] django 데이터 저장

액트 2022. 9. 6.

질문에 대한 답을 작성 할 수 있는 폼을 화면에 만들고 여기에 답을 작성하고 저장하는 폼을 만들어 봅시다. 

django

위와 같이 id는 자동으로 생성되나요? 에 대한 질문에 대한 답을 할 수 있도록 해당 화면 아래에 폼을 만듭니다.

http://localhost:8000/pybo/2/ 의 페이지는 templates/pybo/question_detail.html 에 정의되어 있습니다.

해당 파일을 수정합니다.

답변의 내용을 입력할 수 있는 텍스트창(textarea)과 답변을 저장할 수 있는 "답변틍록" 버튼을 추가합니다.

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

#아래 추가
<form action="{% url 'pybo:answer_create' quesiton.id %}" method="post">
    {% csrf_token %}
    <textarea name="content" id="content" rows="15"></textarea>
    <input type="submit" value="답변등록">
</form>

<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' quesiton.id %}" method="post">

 POST 방식으로 답변 저장

{% csrf_token %}

이 명령어는 보안에 관련된 항목으로 form 으로 전송한 데이터가 실제 웹 페이지에서 작성한 데이터인지를 판단하는 가늠자 역할을 합니다. 따라서 form 태그 바로 밑에 {% csrf_token %} 태그를 항상 위치시켜야 합니다.

※ POST 요청시 form 태그에 csrf_token이 없으면 장고는 오류를 냅니다.

 

<h5>{{ question.answer_set.count }}개의 답변이 있습니다.</h5>

구문부터는 등록된 답변을 상세 화면에 표시하는 명령어입니다.

question.answer_set.count 는 저장된 답변의 총 갯수입니다.

 

URL 매핑

위에서 추가한 url 'pybo:answer_create' 별칭을 매핑해 줍시다. 

매핑은 pybo/urls.py 파일에서 urlpatterns 부분을 수정하시면 됩니다.

answer_create 별칭에 해당하는 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')
]

이제 http://localhost:8000/pybo/answer/create/2/ 와 같은 페이지를 요청하면 URL 매핑 규칙에 의해 views.answer_create 함수가 호출될 것입니다.

 

뷰 함수

URL 매핑 규칙에 정의된 views.answer_create 함수를 pybo/views.py 파일에 추가합니다.

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)

첫 번째 줄

answer_create 함수의 매개변수 question_id는 URL 매핑에 의해 그 값이 전달됩니다. 

만약 http://loclahost:8000/pybo/answer/create/2 라는 페이지를 요청하면 매개변수 question_id에는 2라는 값이 전달될 것입니다.

그리고 답변 등록시 텍스트 창에 입력한 내용은 answer_create 함수의 첫 번째 매개변수인 request 객체를 통해 읽을 수 있습니다.

세 번째 줄 

request.POST.get('content') 로 텍스트 창에 입력한 내용을 읽을 수 있습니다.

request.POST.get('content')는 POST로 전송된 폼 데이터 항목 중 content 값을 의미합니다.

question.answer_set.create(content=request.POST.get('content'), create_date=timezone.now()) 명령어를 텍스트 창에 입력된 내용을 저장합니다.

네 번째 줄

return redirect 명령어로 해당 페이지를 다시 불러와 결과 값을 출력해 줍니다.

댓글