지금까지 url을 입력하면 view 메소드를 사용해서 결과를 웹 페이지에서 확인했습니다.

이제 실제 html파일을 띄워보려고 합니다.

Django에서 이런 html파일을 template이라고 표현합니다.


1. template 만들고 view로 보이기

먼저 화면에 보여줄 html 파일을 생성하겠습니다.

이 html 파일은 app파일 내에 만들어줍니다.
각 html파일은 app에 따라 categorizing될 것이기 때문입니다.

firstapp폴더에서 templates폴더를 만듭니다

그리고 app이름과 동일한 폴더를 하나 더 만들고 그 안에 template을 만듭니다.

즉, firstapp/templates/firstapp 이런식으로 폴더를 만듭니다.

이유는 나중에 알아보도록 하겠습니다.
어찌되었든 이렇게 폴더를 중첩해주는 것을
Template namespacing이라고 합니다.

이제 firstapp/templates/firstapp안에 html파일을 만듭니다.

#firstapp/templates/firstapp/index.html

 <html>
   <head>
       <meta charset="utf-8">     
       <title>first template</title>
   </head>

   <body>
   Hello world!
   </body>

 </html>

이제 html을 만들었으니 이 html파일을 보여주라고 view에게 알려줘야 합니다.

firstapp의 views.py에서 index 메서드를 수정하겠습니다.

from django.template import loader

def index(request):
    template = loader.get_template('firstapp/index.html')
    context = {}
    return HttpResponse(template.render(context, request))

여기서 살펴볼 것이 하나 있습니다.

'firstapp/index.html'로 불러왔다는 점입니다.

아까 전에 firstapp/templates/firstapp으로 폴더를 중첩시켰는데 그 이유가 여기에 있습니다.

Django는 html 파일을 찾을 때, 이름이 매치되는 첫번째 파일을 가져옵니다. 그러므로 다른 app 폴더의 template중 같은 이름을 가진 html 파일이 있다면 그 파일을 가져올 수도 있는 것입니다.

이를 방지하기 위한 방법이 폴더를 중첩시키는 Template namespacing 입니다.

다시 본론으로 돌아오겠습니다.
우리는 firstapp의 views.py에서 index 메서드를 수정했습니다.

import해온 메서드를 하나하나 자세히 알아보기보다 그냥 역할만 짚고 넘어가겠습니다.

template = loader.get_template('firstapp/index.html')

index.html 파일을 가져와서 template이란 변수에 저장합니다.

context = {}

데이터입니다. 추후에 알아보겠습니다. 지금은 넘어가겠습니다.

return HttpResponse(template.render(context, request))

Http응답으로
아까 선언한 template이란 변수를 렌더링해서보여줄건데
이때, context와 request라는 argument를 가지고 렌더링한다 정도로 알아두고 있으면 됩니다.

이제 runserver를 해보면 우리가 연결해준 html파일을 볼 수 있습니다.


2. template에서 변수데이터 사용하기

이제 context의 역할에 대해 알아볼 차례입니다. 위에서 render 메서드가 context와 requests를 받아 렌더링하는 것이라 했습니다.

그리고 context는 데이터라고 했습니다.

정리하자면, context라는 정보를 이용해 template을 꾸며준다. 라고 받아들이시면 됩니다.

웹페이지를 불러왔을 때
즉, request가 발생했을 때 시간을 받아서
template으로 보여주겠습니다.


일단, 한국 시간으로 설정하겠습니다.

프로젝트 파일의 settings.py에서 TIME_ZONE을 다음과 같이 바꿔줍니다.

 TIME_ZONE = 'Asia/Seoul'

views.py로 넘어와서 다음과 같이 수정해줍니다.

from datetime import datetime

def index(request):
    template = loader.get_template('index.html')
    now = datetime.now()
    context = {
        'current_date': now
    }
    return HttpResponse(template.render(context, request))

시간정보를 받기 위해 datetime을 import했고
now라는 변수에 datetime.now()의 리턴값을 받았습니다.
그리고 context라는 dictionary에 Key로 'current_date'그리고 Value로 아까 선언한 now를 넣어줬습니다.

이제 template을 약간 손보겠습니다.

<body>
    Hello world!
    <p>{{ current_date }}</p>
    <p>{{ current_date|date:"Y년 m월 d일 H시 i분 s초" }}</p>
</body>

우리는 template을 렌더링할 때 context라는 데이터를 사용하고 있습니다.

이 context라는 데이터를 template에서 사용하는 방법은 위와 같습니다.

double curly brace안에 key를 명시해주어서 그 데이터를 사용합니다.

{{ current_date|date:"Y년 m월 d일 H시 i분 s초" }}

위와 같은 경우는 표기법을 나타냅니다. Django에서 지원하는 방식입니다.

Django Formatting forms에 대해 검색하면 이와 관련된 정보를 얻을 수 있습니다.

이렇게 template까지 완성한 뒤에 runserver하게 되면 다음과 같은 결과를 볼 수 있습니다.

스크린샷, 2019-10-19 23-57-40.png