본문 바로가기
django

#django day5

by 희구리 2020. 4. 28.

#django day4에서 django 프로젝트는 url - view - template의 기본순서로 진행되는 것을 알았다.

 

또한 간단한 실습을 통해 최종적으로 사용자에게 보여줄 화면에 해당하는 것이 template의 html파일인것도 눈으로 확인하였다.

 

오늘은 template의 html파일에 다양한 것들을 출력해보는 실습을 해보자.

 

어제의 실습에서는 내가 출력하고 싶은 모든 것들을 template의 index.html 파일에만 작성하였다.

비록 h태그를 이용한 6단어 뿐이지만...

 

이번에는 template을 호출하는 것이 views.py의 함수니까 html파일을 가져오면서 해당 html파일에

내가 원하는 값을 함수에 같이 담아 넘겨줄 수는 없을까? 라는 생각으로 실습을 진행해보자.

 

로또 번호 추첨하기

html파일에 로또 번호 6개를 출력해보자.

 

먼저 프로젝트를 진행하는 순서는? url - view - template 였기 때문에 url 부터 설정해보자.

urls.py

urls.py

프로젝트의 urls.py에 들어가 현재 진행하는 실습인 lotto의 키워드를 따와 위와 같이 url을 생성해주자.

 

다시 한 번 반드시 기억해야하는 두 가지를 얘기하면 다음과 같다.

첫번째 인자 - 내가 설정할 url의 이름('lotto/')

두번째 인자 - 해당 url로 요청이 들어왔을 때 views.py에서 실행시킬 함수의 이름을 지정(views.lotto)

 

그 다음으으로 이전에 만들었던 hello 앱의 views.py로 들어가 url에서 정의한 lotto 함수를 만들어보자.

views.py

views.py - 1

views.py은 파이썬 파일이다. 따라서 기존에 파이썬을 사용했던 것 처럼 함수를 만들어주면 된다.

 

랜덤으로 6개의 lotto번호를 추출하는 실습이니 random함수를 사용하기 위해 import random을 해주고

random.sample을 이용해 1부터 45까지의 숫자 중 6개를 뽑는 코드를 위처럼 작성해주자.

그리고 random.sample로 뽑힐 6개의 숫자를 pick이라는 변수에 담아보자.

views.py - 2

그 다음으로 이전에 배웠던 render함수를 return해주는 코드를 작성하면 되는데

필수인자였던 request와 html파일을 순서대로 작성해주면 된다.

html 파일이름은 lotto.html로 작성해보자.

 

그런데, 이대로 실습을 마치면 우리가 만들었던 랜덤한 로또 번호 6개를 담은 pick은 쓸모가 없어지게 된다.

우리는 lotto.html에 pick을 보내서 출력하고 싶은데 어떻게 해야할까?

views.py - 3

다음 코드를 살펴보면 11번째 줄에 이전에 보지못했던 'context'라는 딕셔너리가있다.

context 딕셔너리는 방금 우리가 만든 pick값을 key와 value로 가지고 있으며 이를 render의 3번째 인자로 넣어주고 있다.

 

실습을 진행하기전 "함수에 어떠한 값을 담아서 template으로 넘겨줄 수는 없을까?"라는 의문을 가지고 실습을 해보자고 하였는데 그 의문에 대한 해답을 context가 가지고 있다.

 

django에서 views.py는 파이썬 파일이다보니 함수내에서 충분히 어떠한 작업(연산 등)을 진행할 수 있다는 것에대해서는 의심하지 않을 것이다.

 

또한 우리가 django 개발자가 아니어도 사용자에게 보여주는 html파일에서 긴 코드의 작업을 하는 것보다는

views.py 파이썬 파일에 정의한 함수 내부에서 사용자에게 보여줄 결과물들을 미리 작업하고 html파일에 그 결과값만 갖다줘서 출력하는 것이 훨씬 효율적이고 빠르다는 것을 알 수 있다.

 

그리고 django는 후자의 상황에 대비해 함수내부에 정의한 값(변수)들을 template의 html파일에 넘겨주기 위해서 context라는 딕셔너리를 제공해주고 있다.

파이썬에서 배웠던 딕셔너리이므로 사용방법도 동일하다

 

현재 실습에서는 랜덤한 6개의 로또 번호를 담아준 'pick'이 우리가 html파일에 넘겨주고 싶은 값이므로

context 딕셔너리에 pick을 담아주면 된다.

 

추가적으로 key와 value는 비슷한 이름으로 지정해줘야 html파일에서

value를 갖고 올 때 key 이름을 보고 어떠한 value가 담겨있는지에 대한 혼동이 덜 할 것이다.

 

마지막으로 함수에서 return을 할 때 render함수를 통해 html파일을 호출했었는데

이 때 render의 3번째 인자로 context 딕셔너리를 같이 넘겨주면 호출하려 했던 html파일에 context에 담긴 값들을 사용할 수 있을 것이다.

django 공식문서 render함수 참고할 것

 

자세한 내용은 공식문서를 참고하면 되며

우리가 최종적으로 render에 대해서 기억해야 할 것은 아래와 같다.

render

  • 첫 번째 인자는 request (필수)
  • 두 번째 인자는 html파일 (필수)
  • 세 번째 인자는 context딕셔너리 (선택)

template(.html)

마지막으로 template이다 출력할 화면이고 파일형식은 html파일이다.

이전에 templates에서 index.html을 만들었었는데 같은 경로에 views.py에서 정의한 lotto.html을 생성해보자.

lotto.html

먼저 페이지에 제목처럼 h1태그를 이용하여 '오늘의 로또 번호는?'문장을 입력해보자.

 

다음으로 context로 넘겨준 pick을 lotto.html에 출력해줘야 하는데 어떻게 해줘야 할까? 

lotto.html - 2

만약 제목처럼 로또 번호를 담고 있는 변수 pick을 h3태그를 이용해 다음과 같이 출력한다면 어떻게 될까?

 

python manage.py runserver 8080 명령어를 통해 서버를 실행시켜보자

서버 실행 후 화면

실행을 시키면 다시 오류페이지가 나타나는데 잘못된 것이 아니라 우리가 만든 lotto/ url이 3번째로 잘 나타나고 있음을 알 수 있다.

그러면 이전 실습에서 우리가 만든 url에 접속했던것과 동일하게 url 끝에 /lotto를 입력하여 접속해보자.

 

lotto.html - 3

접속을 해보면 다음과 같은 화면이 뜬다. url을 보면 우리가 만든 'lotto/' url경로로 잘 들어온 것을 알 수 있는데

문제는 pick을 단순히 h3태그안에 적었기 때문에 문자형태 그대로 h3태그에 감싸져서 출력이 됐다.

 

pick은 문자가 아닌 변수인데... 변수를 출력하려면 어떻게 해야할까?

lotto.html - 4

정답은 pick 변수 양옆에 중괄호 2개를 위 사진처럼 붙여주는 것이다.

해당 내용은 django의 html문법인 DTL에 해당하며 다음시간에 배울 것이다.

 

위 사진처럼 코드를 작성한 후 다시 서버를 실행시키면?

lotto.html - 5

로또 번호 6개가 화면에 잘 출력되고 있다.

그리고 새로고침할 때 마다 url - view - template 순서대로 다시 요청 & 응답이 진행되다보니

views.py에서 정의한 랜덤함수도 새로고침을 할 때 마다 다시실행되어 새로운 로또번호를 출력해주고 있다.

 


 

'django' 카테고리의 다른 글

#django day7  (0) 2020.05.05
#django day6  (0) 2020.04.30
#django day4  (0) 2020.04.28
#django day3  (0) 2020.04.26
#django day2  (0) 2020.04.25

댓글