본문 바로가기

Pyhon/Django

[Pyhon/Django] 장고 기초#012. 장고 템플릿 확장(Template extending)

템플릿 확장하기(Template extending)

이전 문서에서 post_list.html과 blog.css 파일을 수정하였습니다. 이번 문서를 따라가면 post_list.html을 한 단계 더 폴리싱 할 수 있습니다. 이번에는 장고의 템플릿 코드 {% block content %}를 활용하여 하나의 html 문서 내용을 다른 문서에서 공유하여 사용할 수 있도록 합니다. 이렇게 작업했을 때의 장점은 공통의 포멧을 지니는 html 코드 하나를 관리함으로써 유지/보수 단계에서 유리하다는 점입니다(그렇지 않은 경우 중복되는 html 코드를 수정하기 위해서 이를 포함하는 모든 html 문서를 따로 수정해야 합니다).

우선 post_list.html과 같은 디렉토리에 base.html을 생성합니다. base.html은 장고 템플릿에서 앞서 말한 공통의 포멧을 정의하는 html 파일입니다. 파일을 생성하고, post_list.html의 내용을 모두 복사하여 붙여넣습니다. 그 다음 <body> 태그의 내용을 다음과 같이 수정합니다.

{% load static %}
<html>
    <head>
        <link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap.min.css">
        <link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap-theme.min.css">
        <link href="//fonts.googleapis.com/css?family=Lobster&subset=latin,latin-ext" rel="stylesheet" type="text/css">
        <link rel="stylesheet" href="{% static 'css/blog.css' %}">
    </head>
    <body>
        <div class="page-header">
            <h1><a href="/">Blog post list</a></h1>
        </div>
        <div class="content container">
            <div class="row">
                <div class="col-md-8">
                    {% block content %}
                    {% endblock %}
                </div>
            </div>
        </div>
    </body>
</html>

block은 다른 html 문서의 내용을 포함합니다. 다시 말해서 post_list.html을 렌더링할 때 base.html의 {% block content %}와 {% endblock %} 사이에 post_list.html(그리고 다른 문서 역시)의 내용을 포함하게 됩니다.

이제 post_list.html을 아래와 같이 수정합니다.

{% extends 'blog/base.html' %}

{% block content %}
    {% for post in posts %}
        <div class="post">
            <div class="date">
                {{ post.published_date }}
            </div>
            <h1><a href="">{{ post.title }}</a></h1>
            <p>{{ post.text|linebreaksbr }}</p>
        </div>
    {% endfor %}
{% endblock %}

extends는 다른 상위 문서가 해당 문서를 포함하고 있다는 의미입니다. 내용 그대로 앞서 작성한 base.html이 post_list.html 문서를 포함하게 됩니다. 템플릿 코드에서 상위 문서의 경로와 이름을 지정하게 되므로, 상위 문서는 꼭 base.html이 될 필요는 없습니다. 이는 각 html 문서가 서로 다른 상위 문서를 extends 할 수 있음과 동일한 의미입니다. 하위 문서(post_list.html)에서 역시 {% block content %}와 {% endblock %}를 선언해야 하며, 이는 상위 문서의 {% block content %}와 {% endblock %} 사이에 하위 문서의 이어지는 내용을 포함하겠다는 의미입니다.

웹 브라우저에서 다시 요청(http://127.0.0.1:8000/)을 보내보면 이전과 동일한 결과를 보여주지만, 실제로는 base.html에서 공통 코드를 처리하게 되므로 다른 html 문서를 작성 할 때도 통일된 스타일과 포멧을 그대로 사용 할 수 있다는 점에서 차이가 있습니다.