티스토리 뷰

반응형

첫 번째 장고 앱 작성하기, part 3 따라 해본 것을 기록 🍯

 

 

이번 튜토리얼에서는 view를 만들어봅니다. poll 앱에 필요한 4개 뷰를 만듭니다. 

 

 

 

 

 

polls > views.py 에 뷰를 추가해주세요

(참고로 index함수는 Writing your first Django app, part 1 (2) 여기서 이미 만들어줬던 함수입니다.)

 

 

 

 

polls > urls.py에 가서 urlpatterns를 추가합니다. 

 

 

 

 

장고는 정의해둔 urlpatterns에서 매칭되는 URL pattern을 찾았다면 HttpRequest object를 가지고 넘겨준 view function을 call 합니다.

그래서 views 함수들의 첫번째 input에 모두 request라는 input을 받게 만들어줬습니다.

그리고 아까 추가한 함수들(index 함수빼고)은 두번째 input에 question_id를 받게 해줬습니다. 

 

이게 어떻게 동작하는 지 살펴보겠습니다 :-) 

 

 

사용자가 예를 들어 "/polls/34/"를 요청했을 때

 

1)  Django는 가장 먼저 mysite.urls 를 불러온다.

 

그 이유는

mysite > settings.py 에서

ROOT_URLCONF 에 mysite.urls를 바라보게 되어있기 때문이다. 

 

 

 

 

2)  mysite.urls에서 urlpatterns라는 변수를 찾고, 그 중  'polls/'를 찾는다. 

 

mysite > urls.py 는 이렇게 구성되어있다. 

 

 

 

 

 

3)  일치하는 텍스트("polls/")를 버리고, 남은 텍스트인 "34/"를 'polls.urls' URLconf로 전달하여 남은 처리를 진행한다. 

 

polls > urls.py 는 이렇게 구성되어있다. 

 

 

 

 

urlpatterns 중 '<int:question_id>/'와 일치하여, 결과적으로 detail() 뷰 함수가 호출된다. 

 

이런식으로 detail함수가 호출됩니다. 

 

 

question_id=34 부분은 <int:question_id> 에서 왔습니다. 
괄호를 사용하여 URL 의 일부를 "캡처"하고, 해당 내용을 keyword 인수로서 뷰 함수로 전달합니다. 
문자열의 :question_id> 부분은 일치되는 패턴을 구별하기 위해 정의한 이름이며, 
<int: 부분은 어느 패턴이 해당 URL 경로에 일치되어야 하는 지를 결정하는 컨버터입니다.

라고 문서에 나와있습니다. 

 

 

 

아무튼 그래서 polls/34/ 로 요청하면 detail 함수가 실행되어 이런 응답을 줍니다 

 

 

 

 

 

 

뷰가 실제로 뭔가를 하도록 만들기

 

이제 뷰가 뭔가를 더하도록 만들어보겠습니다.

각 뷰는 두 가지 중 하나를 하도록 되어 있습니다. 

요청된 페이지의 내용이 담긴 HttpResponse 객체를 반환하거나, 혹은 Http404 같은 예외를 발생하게 해야합니다. 

 

뷰는 데이터베이스의 레코드를 읽을 수도 있습니다. 또한 뷰는 Django나 Python에서 서드파티로 제공되는 템플릿 시스템을 사용할 수도 있습니다. 뷰는 PDF를 생성하거나, XML을 출력하거나, 실시간으로 ZIP 파일을 만들 수 있습니다. 뷰는 당신이 원하는 무엇이든, Python의 어떤 라이브러리라도 사용할 수 있습니다.

 

우리는 여러가지 할 수 있는 것 중, Django 자체 데이터베이스 API를 사용하여 화면에 보여주도록 할게요. 이전 장에서 만든 데이터베이스를 활용하여....!! 

 

그 작업을 하기 전에 가장 먼저 Python 코드로부터 디자인을 분리하도록 Django의 템플릿 시스템을 사용해봅시다.

 

 

Template

mysite > settings.py에 가서 TEMPLATES 설정을 봐주세요. 

Django가 어떻게 템플릿을 불러오고 렌더링 할 것인지 기술해놓은 코드라고 합니다. 

 

 

 

 

DjangoTemplates은 각 INSTALLED_APPS 디렉토리의 "templates" 하위 디렉토리를 탐색한다고 합니다.

 

그래서 우리는 DjangoTemplates이 찾을 수 있게 polls 디렉토리 아래에 templates라는 디렉토리를 만들 것입니다. 

그리고 그 아래 polls라는 디렉토리를 하나 더 만들어주고 여기에 index.html 파일을 만들어줄 것입니다. 

 

polls/templates/polls/index.html  <- 즉 이렇게 되어야합니다!!

 

그 이유는 장고가 polls/templates 를 찾은 후, 

이 템플릿을 polls/index.html  이라는 이름으로 참조하기 때문이라고 하네요. 

 

 

Step 1.

index.html를 만들고 이렇게 간단히 구현을 해줍니다. 

 

 

 

 

그 다음,  polls > views.py에서 index 뷰를 업데이트 해보도록 하겠습니다. 

django.shortcuts에 있는 render라는 함수를 이용해보겠습니다. 

 

 

 

render라는 함수는 request와 template_name을 필수로 받고

넘겨준 것들을 조합하여서 HTTPResponse를 리턴해주는 함수라고 합니다. 

 

 

 

 

 

이렇게 index함수를 구현해주고 localhost:8000/polls/ 로 접속해보면 

템플릿 (index.html)을 잘 불러와주는 것을 볼 수 있습니다. 

 

 

 

 

 

 

Step 2. 

그러면 여기서 한 단계 더 나아가서  polls/index.html 에 데이터를 전달하는 방법을 알아봅시다!! 

우선 index.html을 아래와 같이 바꿔 주세요 

 

 

 

 

그리고 아래 URL로 다시 들어가보면 아직 latest_question_list를 받지 않았기 때문에 

else문에 해당하는 문구가 나오네요..!! 

 

 

 

 

그럼 if문에 해당하는 내용들이 나오도록 작업을 해주겠습니다. 

 

 

views.py를 이렇게 바꿔주세요..!! 

 

 

 

 

index 뷰를 호출했을때, Question 모델 또는 디비에서 object들을 불러오고, pub_date 기준으로 정렬을 해서 출력합니다. (5개 까지만 출력되도록 해줬네요)

그 후, django.template 모듈에서 import한 loader 함수를 이용해서 아까 만들었던 템플릿을 로드 해줍니다. 

 

그리고 context라는 개념이 나오는데요...!!! 

context는 템플릿에서 쓰이는 변수명과 Python 객체를 연결하는 사전형 값이라고 합니다.

그래서 index.html에서 쓰는 latest_question_list를 키값으로 하여 value로 값을 넘겨주는 군요.

 

 

 

 

그 다음 template.render를 봅시다. get_template(template_name) 함수는 Template를 리턴해주기 때문에,

template은 Template 타입이고 render라는 함수를 호출하고 있네요.

이 함수는 context를 받아서 템플릿을 Render해주는 함수라고 합니다. 

 

 

 

 

그리고 템플릿에 context를 채워넣어 표현한 결과를 HTTPResponse로 감싸서 리턴해주네요. 

 

그러면 다시 localhost:8000/polls/  에 접속해주세요 

index.html로 데이터를 잘넘겨줘서 DB에 있는 것들이 잘나오는 것을 볼 수 있습니다.

 

 

 

 

 

 

Step 3.

 

이 작업을 하기 전, django.shortcuts 모듈의 render 함수를 이용했던 것이 기억나시나요?+?

render 함수를 이용하여 더 간단하게 위의 작업을 해줄 수 있습니다. 

 

 

템플릿에 context 를 채워넣어 표현한 결과를 HttpResponse 객체와 함께 돌려주는 구문은 자주 쓰는 용법이라서

Django는 이런 표현을 쉽게 표현할 수 있도록 단축 기능(shortcuts)을 제공해주는 거래요 (짱짱..)

 

두 라인을 빼고

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

 

아래 라인을 추가해주세요

from django.shortcuts import render

 

index함수도 아래와 같이 바꿔주세요 

 

 

 

 

 

아까 아주 간단히 살펴봤던 render함수를 다시 보면 context도 받을 수있게 되어있는 것을 볼 수 있습니다.

 

 

 

한국말 해석보다 영어가 더 와닿네요

 

Combines a given template with a given context dictionary 

and returns and HTTPRespose object with that renderd text

 

앞으로 자주 쓸 것 같은 함수입니다...!! 

 

 

 

 

목록의 아이템 눌렀을 때 보이는 detail 함수에 대한 것은 다음 포스팅에 이어집니다 🍃 💨

반응형
댓글