Study/Django

[Django] 데이터 저장 (10)

taecongs 2023. 9. 12. 16:43

Django 공부하기 ✨
참고 사이트 : 파이보 (점프 투 장고)


점프 투 장고 이어서 진행하기

  • 질문 상세 템플릿 (question_detail.html) 에 필요한 작업을 진행 할 예정이다.

 

(1) 답변 등록 폼 생성하기

  • 질문 상세 템플릿에 다음처럼 답변을 저장할 수 있는 폼(form)을 추가한다.
// (1) projects\mysite\templates\pybo\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>
  • 답변 저장을 위한 URL은 form 태그의 action 속성에 {% url 'pybo:answer_create' question.id %}로 지정했다.
  • {% csrf_token %}은 보안에 관련된 항목으로 form으로 전송한 데이터가 실제 웹 페이지에서 작성한 데이터인지를 판단하는 가늠자 역할을 한다.
  • form 태그 바로 밑에 {% csrf_token %} 태그를 항상 위치시켜야 한다.

 

(2) URL 매핑 정의하기

  • 현재 answer_create 별칭을 찾을 수 없다는 오류가 발생한다.
  • pybo/urls.py에 다음과 같은 URL 매핑을 등록해야한다.

// (2) projects\mysite\pybo\urls.py 파일 수정하기
from django.urls import path

from . import views

app_name = 'pybo'

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'),
]
  • answer_create 별칭에 해당하는 URL 매핑 규칙을 등록하였다.
  • http://locahost:8000/pybo/answer/create/2/ 와 같은 페이지를 요청하면 URL 매핑 규칙에 의해 views.answer_create 함수가 호출된다.

 

(3) 뷰 함수 정의하기

  • URL 매핑 규칙에 정의된 views.answer_create 함수를 pybo/views.py 파일에 추가해야한다.
// (3) projects\mysite\pybo\views.py 파일 수정하기
from django.shortcuts import render, get_object_or_404, redirect  // 추가된 항목
from django.utils import timezone  // 추가된 항목
from .models import Question

(... 생략 ...)

// 추가된 항목
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 함수의 첫번째 매개변수인 request 객체를 통해 읽을 수 있다. 즉, request.POST.get('content')로 텍스트창에 입력한 내용을 읽을 수 있다. request.POST.get('content')는 POST로 전송된 폼(form) 데이터 항목 중 content 값을 의미한다.
  • 답변을 생성하기 위해 question.asnswer_set.create 를 사용하였다. question.answer_set은 질문의 답변을 의미한다. Question과 Answer 모델은 서로 ForeignKey 로 연결되어 있기때문에 이처럼 사용할 수 있다.

 

(4) 답변 저장

  • 답변을 등록하더라도 화면에는 아무런 변화가 없다.
  • 등록된 답변을 표시하는 기능을 템플릿에 추가하지 않은 상태이다.

 

(5) 답변 조회

  • 등록된 답변을 질문 상세 화면에 표시하려면 질문 상세 템플릿을 수정해야 한다.
// (4) projects\mysite\templates\pybo\question_detail.html 파일 수정하기
<h1>{{question.subject}}</h1>
<div>
    {{question.content}}
</div>

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

{% comment %} 답변 등록 {% endcomment %}
<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>

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

[Django] url.py과 view.py 조금 더 알아보기  (0) 2023.09.13
[Django] settings.py  (0) 2023.09.13
[Django] URL 별칭 (9)  (0) 2023.09.12
[Django] 템플릿 언어  (0) 2023.09.11
[Django] 조회와 템플릿 (8)  (0) 2023.09.11