views 와 url을 연결하는 것은 지난 포스팅에서 다루었다.
이제 그 views.py를 작성 할 것이다.
개발환경이 바뀌었다.!!!!
우분투 너무 느렸는데, CentOS로 옮겼다. 아주 쾌적하고 좋았다. :)
우리는 4개의 view를 만들어야했다.
1. index : 설문지 리스트를 보여주는 view
2. detail : 특정 설문지에 들어가서 선택지들을 보여주는 view
3. vote : 선택지를 선택한 것에 대한 처리를 담당하는 view
4. results : 설문 결과를 보여주는 view
(views.py)
지금 단계로는 우리가 계획한 view를 바로 설계할 수 없다.
위에 작성한 코드들은 해당 페이지와 연결을 하는 것을 해보기 위해서이다.
보면 view에 인자들을 살펴봐야한다.
첫번째 인자는 request 로 요청에 대한 객체이다.
두번째 인자는 넘겨 받는 인자인데, 우리가 urls.py를 작성할 때 url 주소에서 파싱한 내용들이다.
(polls/urls.py)
이대로 실행해보자.
polls/3 의 주소를 요청하게 되면
뒤에 3이 question_id 라는 변수에 들어가서 넘겨가는 것이다.
(실행 화면)
이제 실제로 view에서 무언가를 처리하는 것을 넣을 것이다.
위에서는 단순하게 인자를 넘겨받는 것 까지만이었다.
최근 설문지 5개를 가져와서 출력하는 것을 해보자!
(views.index)
그리고 해당 설문지의 설문내용을 하나씩 붙여서 output에 넣고
그 output을 화면에 출력해주는 코드이다.
확인!
(확인)
장고는 모델과 뷰, 템플릿이 따로 관리되는 MTV 구조를 가지고 있다.
그에 따라 우리도 템플릿을 만들어서 여기서 보여주는 것을 해볼 것이다.
템플릿은 settings.py 파일에서 INSTALLED_APP 디렉토리에서 하위 templates 디렉토리를 탐색한다.
고로 우리는 polls/templates 를 만들어야한다.
여기서 다시 polls 디렉토리를 만든다.
정리하면,
polls/templates/polls
이렇다.
이유는 장고가 템플릿을 찾을 때 이름이 일치하는 첫번째 템플릿을 가져온다.
그렇다면 동일한 템플릿 이름이 다른 APP에도 있다면? 어떻게 구분할 수 있을까?
그렇기 때문에 templates디렉토리 아래에 해당 어플 이름으로 디렉토리를 하나 더 만들어 주어서
템플릿에 이름을 구분시켜주는 것이다.
polls/templates/polls/index.html 을 만들자!
(polls/templates/polls/index.html)
코드 설명
latest_question_list에서 하나씩 가져와서 question에 넣으면서 반복한다.
question의 id 값을 이용해 링크 걸린 문구를 출력한다.
만약 가져올 설문이 하나도 없다면
설문이 없다고 출력한다.
이렇게 템플릿을 만들었으니
우리는 view에서 이 템플릿과 연결해야한다.
(polls/views.index)
context 에 latest_question_list 변수를 지정한 사전형 자료를 담아둔다.
그리고 template.render를 해주면 된다.
(결과)
웹 페이지에서 링크로 출력되는 것을 확인 할 수 있다.
여기서 의문이 든다.
템플릿 로드하고, 변수 저장하고 템플릿 렌더해서 HttpResponse로 넘겨준다.
너무 루틴하지 않은가?
우리의 파이썬이 이걸 가만 놔둘리 없다.
단축기로 render라고 만들어두었다.
이 모든 과정을 한방에 해준다.
단축기를 사용해보자.
(단축기 사용)
단순히 템플릿을 지정해주고, 넘겨줄 변수를 사전형으로 만들어서 넘겨주면된다.
views에서 처리해야할 일이 또 뭐가 있을까?
바로,
에러처리다.
웹 페이지에서 대표적인 에러는 바로 404 에러이다.
해당 웹 페이지가 없는데 요청하는 것이다.
예를 들어 /polls/24 -> 만약 id가 24가 없다면 해당 페이지는 준비 되지 않은것이다.
404 에러 처리를 해보자!
(404 에러처리)
해당 쿼리를 날려서 설문지를 가져오는데 만약 그게 없다면
404 에러를 반환한다.
실행하기 위해 detail.html을 만들어야하는데 형식상 만드는 것이므로 지금은 아주 간단히 작성한다.
(polls/templates/polls/detail.html)
없는 인덱스로 실행해보자.
(404 에러)
우리가 404 에러 처리를 하였다.
그렇다면 여기서도 또 의문이 든다.
try except 구문
왠지 많이 자주 쓰일 것이다.
그렇다!
이것 또한 단축기로 만들었다.!!!!
get_object_or_404 를 이용하면 해당 객체를 가져오는데 만약 없다면 404 에러를 내는
우리가 위에서 했던 것을 한방에 해주는 함수다.
(단축기 사용)
실행해본다.
(실행 결과)
다만 에러 문구는 다르다!
이제 detail.html 템플릿에서
선택지를 보여주는 작업을 해볼 것이다.
(polls/templates/polls/detail.html)
question 객체를 받았다.
설문지에서 선택지를 전부 가져와서 하나씩 choice에 넣고
choice의 선택지를 출력해주는 것을 반복하는 코드이다.
실행해보면
(실행)
index 템플릿에서 detail 템플릿을 호출하였다.
(index 템플릿)
/polls/
이렇게 url주소가 하드 코딩되어있다.
그렇다면 만약 detail 템플릿의 url이 바뀌면
이렇게 하드코딩된 주소를 찾아서 일일히 다 바꿔야할까?
그렇기 때문에 url 주소를 간편히 쓸수 있는 것이 있다.
(하드코딩 제거)
그렇다면 저 url은 뭘까?
(urls.py)
이것이 우리가 url패턴을 각각 이름으로 정한것이다.
그렇기에 detail url을 쓰고 싶다면
{% url ' detail' %} 이렇게 쓰기만 하면 되는 것이다.
그렇다면 이 이름이 겹치는 것을 생각해봐야한다.
우리는 APP을 여러개 만들 건데 그 url마다 이름을 다 다르게 해야하는 건 너무 힘든 일이다.
다른 APP에 detail이라는 url 이름이 있을 수 있기 때문이다.
이걸 방지하기 위해 app_name을 지정해 줄 수 있다.
(APP 이름 지정)
그렇다면 당연히 아까 적은 url 표기도 바꾸어 주어야한다.
(url 표기 변경)
이렇게 바꾸면 된다.
(* 참조 - https://docs.djangoproject.com/ko/2.0/intro/tutorial03/)
'Web > Django Project' 카테고리의 다른 글
Simple Login/Logout (0) | 2018.07.24 |
---|---|
Django Tutorial - Form 만들기, 제네릭뷰 사용 (0) | 2018.02.06 |
Django Tutorial - 관리자 생성 및 페이지보기 (0) | 2018.01.31 |
Django Tutorial - Model (0) | 2018.01.31 |
Django Tutorial - APP 생성 (0) | 2018.01.31 |