
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 |