[Django] 6. Form

2024. 1. 25. 17:00dev/django

728x90
반응형

Question모델로 부터 질문이 들어오고 해당 답변을 하기 위함.

 

 

 

{% csrf_token %}은 보안 관련이다.

웹페이지가 전달한 클라이언트에게 전달한 토큰을 클라이언트가 다시 웹페이지에 요청할 때 해당 사용자가 맞는지 확인하는 용도로 알 수 있다.

form태그 밑에는 항상 {% csrf_token %}태그를 항상 위치시켜야 한다.

 

 

urls.py에 폼을 띄울 answer_create를 생성한다.

path : projects/mysite/pybo/urls.py

urlpatterns = [
	...
    path('answer/create/<int:question_id>/', views.answer_create, name="answer_create"),
]

 

 

뷰 클래스에 해당 요청이 들어오면 연결해줄 함수를 만든다.

path : projects/mysite/pybo/views.py

 

import

from django.shortcuts import redirect
from django.utils import timezone
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)

 

question.answer_set 은 질문에 대한 답변들을 의미한다.

Answer객체를 만들어주어 저장하는 것과 동일하다.

 

content 뒤에 request.POST.get('content')는 html form에서 내부 내용 중 name값이 'content'인 textarea의 내용들을 넣는 것을 뜻한다.

 

Answer객체를 생성해서 넣어주는 것이 나는 더욱 이해하기 좋다.

def answer_create(request, question_id):
    question = get_object_or_404(Question, pk=question_id)
    answer = Answer(question=question, content=request.POST.get('content'), create_date=timezone.now())
    answer.save()
    return redirect('pybo:detail', question_id=question.id)

 

 

답변한 내용들을 조회하고 싶은 경우

question.answer_set.all : 전체 답변 데이터 조회

question.answer_set.count : 전체 답변 데이터 개수

<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>

 

728x90
반응형

'dev > django' 카테고리의 다른 글

[Django] RESTful API  (0) 2024.01.26
[Django] 7. Static  (0) 2024.01.25
[Django] 5. Template  (0) 2024.01.25
[Django] 4. Admin  (0) 2024.01.25
[Django] 3. Model  (0) 2024.01.25