[Django] render 함수 (render function)

장고 초창기 많은 튜토리얼들을 따라 하다 보면, templates에 저장해둔 html 파일들을 가져다 쓸 때 render라는 함수를 이용한다.

def todo_list(request):
    # complete 열이 False인 행만 가져온다.
    todo = Todo.objects.filter(complete__exact=False)
    return render(request, 'base/todo_list.html', {'todo': todo})

대충 뭐해주는 친구인지는 알겠는데.. 정확히 뭘 하는 함수일까? request는 왜 인자로 넣어줄까? 등등 render에 대한 모든 궁금증을 파헤쳐 보자.

프레임워크를 이용하며 모르는 함수가 생겼을 땐 항상 가장먼저 "공식 문서"를 읽어본다. 이후 여러 블로그들을 참조하며 이에 대한 이해를 확실히 하는 것이 좋다고 생각한다. 추가로, 실력이 된다면 함수를 컨트롤 클릭(파이참 기준)해서 어떻게 작성되어 있는지 확인해 보는 것도 좋다.

 

render(request, template_name, context=None, content_type=None, status=None, using=None)

공식 문서를 보면 위와같이 나와있다.

"HttpResponse" 객체를 주어진 템플릿과 context 사전을 합쳐 렌더된 문자와 리턴해준다.

장고는 TemplateResponse를 리턴하는 shortcut function을 제공하지 않는다. TemplateResponse의 생성자는  render()과 같은 수준의 편리함을 제공하기 때문이다.

라고 영어로 나와있는데..

우선 첫째 줄 부터 정확히 이해해 보자면, render()는 HttpResponse 객체를 리턴해준다. 우리가 인자로 넣어준 템플릿과 사전(context)을 렌더링 해서 같이!라는 뜻으로 보인다.

 

실제로 render()는 다음과 같이 작성되어 있다.

def render(
    request, template_name, context=None, content_type=None, status=None, using=None
):
    """
    Return an HttpResponse whose content is filled with the result of calling
    django.template.loader.render_to_string() with the passed arguments.
    """
    content = loader.render_to_string(template_name, context, request, using=using)
    return HttpResponse(content, content_type, status)

아! render()는 HttpResponse 객체를 반환하는 걸 확인할 수 있다. 그 위의 content는 아마 문자열?로 렌더링 해주는것인가 보다. HttpResponse에 대한 포스팅은 나중에!

 

공식 문서를 계속 읽어보면, 파라미터들에 대한 설명이 나와있다.

 

<필수>

request - 이 응답을 생성하기 위해 사용되는 객체이다. (request도 나중에 포스팅 해야겠다..)

tempate_name - 템플릿이 저장되어 있는 곳의 경로. 기본 경로 설정은 settings.py에서 가능하다.

 

<옵션>

context - html로 내가 필요한 데이터들을 동적으로 보내고 싶을 때 사용. 사전만 가능하다.

content_type - MIME 타입. 기본형은 text/html

status - 상태 코드 설정. 기본은 200. 그냥 정수 값 넣어주면 된다.

using - 템플릿 로딩을 위한 템플릿 엔진의 이름

 

return render(request, 'base/todo_list.html', {'todo': todo}, ontent_type='application/xhtml+xml', status=201)

 

불러온 데이터는 아래와 같이 사용이 가능하다!!

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>TODO</title>
</head>
<body>
    <h1>TODO 목록 앱</h1>
    <a href="{% url 'todo_post' %}">todo 추가</a>
    <ul>
        {% for to in todo %}
        <li>{{ to.title }} <button>완료</button><a href="{% url 'todo_edit' pk=to.pk %}">수정</a></li>
        {% endfor %}
    </ul>
</body>
</html>

 

 


참고

 

https://docs.djangoproject.com/en/4.1/topics/http/shortcuts/