render() 숏컷
템플릿을 읽고, 컨텍스를 채우고, 렌더가 된 템플릿을 결과값으로 가진 HttpResponse 객체를 반환 하는 일은 매우 흔한 일입니다. 따라서, Django 는 이것에 대한 shortcut 함수를 제공합니다.
render() 함수는
템플릿을 읽고, context 를 채우고,
결과를 템플릿에 객체로 반환합니다.
render() 함수를 알아보기 위해서, polls/views.py 에 index() 함수를 다시 써줍니다.
1 | from django.shortcuts import render |
render() 가 기존에 썼었던 HttpResponse 와 같은 작업을 수행하는것을 확인할수 있습니다.
브라우저에서, 아래 URL로 접속해서 확인 합니다.
render() 를 사용하면,
loader 와 HttpResonse 모듈들을 불러오지 않아도 됩니다.
render() 함수는
- 요청을 첫번째 인자로 받고,
- 템플릿 이름을 두번째 인자로 받고,
- 사전 형태의 자료를 선택적으로 세번째 인자로 받습니다.
render() 함수는,
주어진 context 들이 그려진 template 에
HttpResponse 객체를 반환 합니다
404 에러 발생 시키기
polls/views.py 에 있는 detail() 뷰를 한번 보겠습니다 (주어진 투표의 질문들을 나열하는 페이지).
Http404를 통해서, 404 에러를 발생시키는 detail 뷰는 아래와 같습니다.
1 | from django.http import Http404 |
여기서 새로운 컨셉은 Http404 예외 인데,
요청된 ID 를 가진 question 이 존재하지 않을때 예외를 발생시킵니다.
테스트를 진행 하기 위해서, polls/templates/polls/detail.html 파일을 생성하고, 아래 내용을 추가해 줍니다.
1 | {{ quetions }} |
현재 데이터베이스에 있는 질문은 딱 1개로,
이전 과정에서 생성한 “What’s up?” 질문밖에 없으므로,
id 값이 2 인 질문은 존재하지 않습니다.
http://127.0.0.1:8000/polls/1/ 로 접속하면,
What’s Up? 질문이 페이지에 출력이 되겠지만.
http://127.0.0.1:8000/polls/2/ 로 접속하면,
출력할 질문이 없어서, 예외가 발생합니다. 이때 Http404 가 메시지를 출력할겁니다.
Quetion does not exist 가 잘 표시되는것을 확인할수 있습니다.
get_object_or_404() 숏컷 함수
get() 함수를 사용하고, 객체가 존재하지 않을때,
Http404 를 발생시키는것은 매우 빈번하게 일어나는 일입니다. Django 는 이것에 대한 숏컷도 제공합니다.
다시 쓰여진 detail() 뷰는 아래와 같습니다.
polls/views.py 에 detail() 뷰를 아래와 같이 수정해 줍니다.
1 | from django.shortcuts import get_object_or_404, render |
get_object_or_404() 함수는 Django 모델을 첫번째 인수로 받고, 키워드 인수들을 두번째로 받습니다.
받은 인수들을 get() 함수에 전달하고, 객체가 존재하지 않으면 Http404 를 발생 시킵니다.
아래 캡쳐 화면을 통해서,
get_object_or_404() 가 잘 동작하는지 확인 해 봅시다.
http://127.0.0.1:8000/polls/1/ 로 접속하면,
What’s Up? 질문이 페이지에 출력이 되겠지만.
http://127.0.0.1:8000/polls/2/ 로 접속하면,
출력할 질문이 없어서, 예외가 발생하는것은 같은데.
메시지가 “No Question matches the given query” 라고 표시됩니다.
또한, get_list_or_404() 라는 함수도 존재합니다. get_object_or_404 와 비슷하게 동작하지만,
받은 인자들을 함수 대신, filter() 함수에 전달 합니다.
get_list_or_404() 함수는, 빈 리스트가 조회되었을때, Http404 를 발생 시킵니다.
마치며..
장고 숏컷을 다시 리뷰 합니다.
- render() 함수
- Http404() 함수
- get_object_or_404() 함수
filter() 함수와 get() 함수의 차이점도 숙지하고 지나갑니다.