on
[Django] 6. 장고 템플릿 구현
[Django] 6. 장고 템플릿 구현
반응형
이번엔 질문과 답변을 템플릿을 이용해서 만들어보자.
#pybo/views.py from django.http import HttpResponse # http의 응답 from .models import Question def index(request): ''' pybo 목록 출력 ''' question_list = Question.objects.order_by('-create_date') # -로 역순 context = {'question_list':question_list} return render(request,'pybo/question_list.html',context) # 연결되는 html, 전달할 매체 context
render를 이용해서 context에 key : value로 있는 question_list 데이터를 html로 넘겨준다.
이제 이 html이 담겨있는 디렉터리를 구성해보자.
장고 프로젝트 디렉터리 바로 아래에 templates라는 폴더를 생성하고, config/settings.py 을 열어서 수정하자
#config/settings.py ... TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': [BASE_DIR / 'templates'], # <<<< 'APP_DIRS': True, 'OPTIONS': { 'context_processors': [ 'django.template.context_processors.debug', 'django.template.context_processors.request', 'django.contrib.auth.context_processors.auth', 'django.contrib.messages.context_processors.messages', ], }, }, ] ...
템플릿의 경로에 templates를 넣어주자.
BASE_DIR은 프로젝트가 위치하는 디렉터리이다.
장고에서 사용하는 모든 템플릿은 templates 에 담고, 서비스별로 하위 디렉터리를 만들어 관리한다.
ex) 공통 템플릿 : BASE_DIR/templates/layout.html , pybo 템플릿 : BASE_DIR/templates/pybo/~~~.html
그러면 이제 템플릿 디렉터리 아래에 pybo라는 디렉터리를 생성하고, question_list.html이름으로 html파일을 생성하자.
내용은 다음과 같다.
{% if question_list %} {% for question in question_list %} {{ question.subject }} {% endfor %} {% else %} 질문이 없습니다. {% endif %}
처음 템플릿 태그를 보면 어질어질하다.
{% %} 내부에 변수가 적용된다.
즉 {% if question_list %} 파이썬에서도 if question_list 라고 입력하면 비어있는지 / 채워져있는지에 대한 bool이 반환된다.
question_list가 있으면 아래의 구문을 실행. 반복문은 파이썬과 동일하고,
{{question.id}}는 question객체에서 id를 의미한다. 다만 주의할 사항은 반복문과 조건문이 끝날 때, {% endfor %} {% endif %}등을 적어줘야한다.
저렇게 템플릿까지 만들었다면 이제 pybo에 접속해보자
물론 저 링크를 누르면 404페이지가 나온다.
링크를 누르면 /pybo/2/ 이렇게 이동이되는데, 저 url에 대한 정보를 만들어주지 않았기 때문이다.
# pybo/urls.py from django.urls import path from . import views urlpatterns = [ path('',views.index), path('/', views.detail), # 가변적인 endpoint, question.id의 타입은 int이다. ]
url을 매핑해주고 연결되는 함수는 views의 detail 함수에 연결되도록 하자.
/pybo/1 or /pybo/2 ... 이런식으로 pybo다음에 오는 숫자는 가변적이며, question_id라는 이름으로 views.detail에 전달된다.
# pybo/views.py def detail(request,question_id): ''' pybo 내용 출력 ''' question = Question.objects.get(id = question_id) context = {'question':question} return render(request,'pybo/question_detail.html',context)
index함수와 크게 다르진 않아보이지만, detail에는 전달하는 파라미터가 question_id로 하나 더 생겼다.
url에서 question_id를 전달해주기 때문에, 이를 받아서 데이터를 찾고 html로 넘겨준다.
이제 question_detail.html을 작성하자.
templates/pybo/question_detail.html
{{ question.subject }} {{ question.content }}
자 질문 상세화면이 출력되었다.
반응형
from http://kkiho.tistory.com/33 by ccl(A) rewrite - 2021-12-22 14:27:09