<본 강좌는 Mike Hibbert에 의해 제작되었으며, 제가 정리한 내용이 도움이 된다고 생각되시면 반드시 유투브 페이지에 방문하셔서 추천과 구독을 눌러주세요>

Tutorial 3에서는 Views.py , urls.py, 그리고 간단한 template에 대한 내용에 대해 설명 합니다. 

 

Tutorial2에서 설명했던 것과 같이 django의 핵심 프로스세에서 urls.py 는 브라우저로 받은 request를 views.py로 연결해주고, views.py는 해당 요청에 대해 서버에서 처리할 부분을 처리하는 역할을 담당 합니다.

views.py에서는 아까 봤던 models.py에서와는 조금 다르게 함수로 받아서 처리 합니다. 모양은 대충 def name(request): 와 같습니다.

아래 화면은 urls.py에서 hello라는 요청을 받았을 경우 처리하는 views.py를 코드 입니다.

 

from django.http import HttpResponse

# Create your views here.

def hello(request):
    name = "mike"
    html = "<html><body> Hi %s, this seems to have worked</body></html>" % name
    return HttpResponse(html)

HttpResponse 는 웹브라우저에 해당 내용을 출력하도록 해줍니다.

간단하게 위 내용을 설명하자면 hello라는 request를 받으면 name이란 변수를 mike라고 설정하고, html이란 변수는 html언어로 Hi "name변수 내 내용", this seems to have workd란 내용을 설정한 후 html 변수 내용을 웹브라우저에 출력해 라고 하는 내용 입니다.

위 내용이 동작하기 위해서는 hello라는 request를 받을 수 있도록 urls.py를 손봐줘야 합니다.

 

urls.py를 처음으로 열면 위와 같은 화면이 나옵니다.

여기에 url(r'^hello/$', 'article.views.hello'), 을 아래 화면과 같이 입력 합니다.

 

그리고 server를 작동하게 하기 위해서 다시 cmd창을 켜고 manage.py runeserver 8888을 입력 합니다.

포트 8888로 서버에 접속할 수 있도록 설정한다고 보시면 됩니다.

(참고:아래 화면에 [19/JUL 로 시작하는 두줄은 server를 작동시킨다음 웹브라우져를 통해서 요청을 했다는 log 입니다. )

위와 같이 server를 작동시킨 후 웹브라우져를 통해서 http://127.0.0.1:8888/hello/ 에 접속하면 다음과 같은 화면이 출력 됩니다.

 

그런데, 아까 views.py에서 직접 html 코드를 입력하여 위와 같은 화면이 출력되도록 했습니다.

그러나 복잡한 html 화면을 만들어야 한다고 할 때, 모든 html코드를 모두 views.py에 입력할 수 없습니다. 그래서 위와 같은 역할을 동일하게 수행하기 위해서 template이라는 것을 사용합니다.(이 부분은 동영상에 나온 것과 조금 다르지만 작동하는데는 전혀 문제 없습니다.)

우선 프로젝트 하위의 동일한 이름의 폴더에 template을 넣을 수 있는 templates폴더를 만듭니다.

 

위와 같이 폴더를 만들고 나면 settings.py에 들어가서 templates 폴더 위치를 모두 알 수 있도록 세팅해줘야 합니다.

settings.py로 이동한 후 import os 하단에 ROOT_PATH = os.path.dirname(__file__) 라고 입력합니다. 

 

그리고 settings.py 가장 하단으로 내려가서 다음과 같이 작성하여 templates 폴더의 위치를 지정해 줍니다.

이렇게 하고나면 templates 폴더의 위치는 지정 완료 됩니다.

자 그럼 views.py에서 template을 불러와 봅시다.

Template을 사용하는 방법에는 여러가지가 있지만 우선 이번 Tutorial에서는 get_templateContext를 불러와서 구현 하는 방법을 가장 먼저 설명 합니다. 그 외에 render_to_response/ TemplateView 를 사용하는 방법은 이 글 하단에서 추가적으로 설명할 예정 입니다.

get_template은 템플릿을 가져올 수 있도록 합니다. 사용 방법은 아래에서 볼 수 있는 것과 같이 get_template('html파일이름') 으로 코딩 합니다.

Context는 dict방식으로 변수의 이름과 속성을 지정 할 수 있도록 합니다. Context를 통해 render된 값들은 html템플릿에 반영되어 Django에서 출력한 속성을 html에 반영될 수 있도록 해줍니다. 사용 방법은 아래 보는 것과 같이, compiled_template.render(Context({dict 이름값: dict 속성값}))으로 코딩 합니다.

 

from django.http import HttpResponse
from django.template.loader import get_template
from django.template import Context

# Create your views here.

def hello(request):
    name = "mike"
    html = "<html><body> Hi %s, this seems to have worked</body></html>" % name
    return HttpResponse(html)

def hello_template(request):
    name = 'mike'
    t = get_template('hello.html')
    html = t.render(Context({'name':name}))
    return HttpResponse(html)

 

template을 불러오기 위해서는 hello.html이 필요 합니다.

우선 templates/hello.html로 파일을 하나 만들고 아래와 같이 html 코드를 작성 합니다.

<html>
 
     <body>
  
          hi, {{name}},
          this Template seems to have worked!!!
  
     </body>
 
</html>

위에서 views.py에서 Context에서 언급했던 것과 같이 Context를 통해 정의된 'name':name 값이 {{name}}으로 지정되어 있습니다. 해당 html 파일을 server에서 작동시키면 {{name}}으로 지정된 곳에 django views.py안의 hello_template에 name이란 변수로 정의되어 있는 값이 html파일에 출력되게 됩니다.

hello.html파일까지 작성이 완료되면 urls.py를 수정하여 브라우져를 통해서 hello_template을 request할 수 있도록 url(r'^hello_template/$', 'article.views.hello_template'), 를 지정 합니다.

위 작업들을 모두하고 브라우져를 통해서 http://127.0.0.1:8888/hello_template/ 을 입력하면 다음과 같이 출력 됩니다.

render_to_response 로 template 사용하기

template을 사용하는 보다 더 간단한 방법이 있다. 바로 render_to_response를 사용하는 방법이다.

우선 render_to_response를 사용하기 위해서 다음과 같이 선언을 해줘야 한다.

from django.shortcuts import render_to_response

그럼 어떻게 간단해지는 보기위해 기존의 코드 부터 보면 다음과 같다.

def hello_template(request):
    name = 'mike'
    t = get_template('hello.html')
    html = t.render(Context({'name':name}))
    return HttpResponse(html)

위 코드에서 get_template으로 hello.html을 불러오고, html파일 안에 출력될 내용을 Context를 통해서 render해주는 과정을 거친 후 HttpResponse를 통해서 출력하는 과정을 거쳤다.

그런데, render_to_response는 위 과정을 간단하게 한줄로 줄였다. 방법은 간단하다. render_to_response('html파일이름', {Context가 render해야 하는 내용}) 으로 끝이다. 구체적인 코드는 다음과 같습니다.

def hello_template(request):
    name = 'mike'
    return render_to_response('hello.html', {'name':name})

위 코드를 테스트해보기 위해서 아래 render_to_response의 이름을 hello_template에서 hello_template_simple로 변경하고, urls.py에서 hello_template_simple url을 추가하도록 하자.

 

 

이후 http://127.0.0.1:8888/hello_template_simple/ 으로 접속하면 다음과 같이 기존과 동일한 결과가 나온다.

 

이 외에도 TemplateView를 통해서 구현하는 방법이 Tutorial에 나와 있다.

+ Recent posts