[Python] 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 명령어로 해당 페이지를 다시 불러와 결과 값을 출력해 줍니다.
'IT > Python' 카테고리의 다른 글
[Python] django 부트스트랩(Bootstrap) 적용 (2) | 2022.09.19 |
---|---|
[Python] django CSS 적용 방법 스태틱(static) (0) | 2022.09.19 |
[Python] django URL 별칭 만들기 (0) | 2022.09.02 |
[Python] django 템플릿 태그 (0) | 2022.08.31 |
[Python] django 장고 템플릿 (0) | 2022.08.31 |
댓글