당신은 멋쟁이, 우리는 장고쟁이~

0%

Writing your first Django app, part3 - 4편

render() 숏컷



템플릿을 읽고, 컨텍스를 채우고, 렌더가 된 템플릿을 결과값으로 가진 HttpResponse 객체를 반환 하는 일은 매우 흔한 일입니다. 따라서, Django 는 이것에 대한 shortcut 함수를 제공합니다.


render() 함수는

템플릿을 읽고, context 를 채우고,

결과를 템플릿에 객체로 반환합니다.


render() 함수를 알아보기 위해서, polls/views.py 에 index() 함수를 다시 써줍니다.



1
2
3
4
5
6
7
8
9
10
11
from django.shortcuts import render
# render 를 가져옵니다

from .models import Question


def index(request):
latest_question_list = Question.objects.order_by('-pub_date')[:5]
context = {'latest_question_list': latest_question_list}
# return HttpResponse(template.render(context, request)) 대신 아래 render() 를 써줍니다.
return render(request, 'polls/index.html', context)


render() 가 기존에 썼었던 HttpResponse 와 같은 작업을 수행하는것을 확인할수 있습니다.


브라우저에서, 아래 URL로 접속해서 확인 합니다.

http://127.0.0.1:8000/polls/



render() 를 사용하면,

loader 와 HttpResonse 모듈들을 불러오지 않아도 됩니다.


render() 함수는


  1. 요청을 첫번째 인자로 받고,
  2. 템플릿 이름을 두번째 인자로 받고,
  3. 사전 형태의 자료를 선택적으로 세번째 인자로 받습니다.

render() 함수는,

주어진 context 들이 그려진 template 에

HttpResponse 객체를 반환 합니다


404 에러 발생 시키기


polls/views.py 에 있는 detail() 뷰를 한번 보겠습니다 (주어진 투표의 질문들을 나열하는 페이지).


Http404를 통해서, 404 에러를 발생시키는 detail 뷰는 아래와 같습니다.


1
2
3
4
5
6
7
8
9
10
11
from django.http import Http404
from django.shortcuts import render

from .models import Question
# ...
def detail(request, question_id):
try:
question = Question.objects.get(pk=question_id)
except Question.DoesNotExist:
raise Http404("Question does not exist")
return render(request, 'polls/detail.html', {'question': question})

여기서 새로운 컨셉은 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
2
3
4
5
6
7
8
from django.shortcuts import get_object_or_404, render
# get_object_or_404 를 코드 상단에서 가져오는것을 잊지 않습니다.

from .models import Question

def detail(request, question_id):
question = get_object_or_404(Question, pk=question_id)
return render(request, 'polls/detail.html', {'question': question})



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 를 발생 시킵니다.



마치며..


장고 숏컷을 다시 리뷰 합니다.


  1. render() 함수
  2. Http404() 함수
  3. get_object_or_404() 함수

filter() 함수와 get() 함수의 차이점도 숙지하고 지나갑니다.