Django 템플릿 확장

1. 템플릿 확장

웹사이트를 개발하다 보면 모든 (혹은 많은) 웹 페이지마다 공통적으로 들어가는 HTML 코드가 있음을 알게 된다. 각 웹페이지마다 공통 코드를 중복해서 넣어 주는 것은 효율적이지 않다. Django 에서는 이러한 공통 부분을 기본 템플릿(Base Template)으로 만들고, 각 웹페이지 마다 변경이 필요한 부분만 코드를 작성하게 하는 템플릿 확장(Template Extension) 기능을 제공한다 (템플릿 확장은 또한 템플릿 상속(Template Inheritance)이라고도 불리운다).

Base 템플릿을 어디에 만드는가는 개발자가 템플릿을 어떻게 체계화하는가의 문제이다. 여기서는 모든 Django App에 공통적으로 적용되는 Base 템플릿을 (manage.py가 있는) Base Directory 밑의 templates 라는 서브 폴더에 만들어 보자. 즉, 아래 그림과 같이 ./templates/base.html 이라는 Base 템플릿을 만들었는데, 이 파일 안에 각 웹페이지에서 변경 혹은 삽입할 영역을 {% block 블럭명 %} 으로 지정한다. 여기서는 블럭명을 content로 정하여 {% block content %} 으로 표시하였다.

Base 템플릿을 사용(확장)하는 각 Django App의 템플릿들은 각 App 폴더의 templates 폴더에 저장한다. 예를 들어, ./home/templates/index.html에서 base.html을 확장해서 사용한다고 가정해 보자. Base 템플릿을 사용(확장)하는 템플릿 (예: home/templates/index.html)은 아래와 같이 먼저 {% extends %} 확장 템플릿 태그를 사용하여 어떤 Base 템플릿을 사용하는지 지정해 주어야 한다. 이 extends 태그는 항상 템플릿의 처음에 와야 한다. 다음으로 {% block %} 블럭에 삽입하고자 하는 웹 페이지 내용을 작성한다. 아래 예에서는 간단히 h1 태그를 추가하였다. 만약 Base 템플릿에 여러 {% block %} 블럭이 있다면, 확장 템플릿에서 각 블럭의 이름별로 여러 블럭들을 추가할 수 있다.

{% extends "base.html" %}

{% block content %}
    

{{message}}

{% endblock content %}

위의 Base 템플릿이 제대로 동작하기 위해서는 아래에서 설명할 템플릿 위치와 관련된 셋팅을 추가해 주어야 한다.

2. 템플릿 위치 셋팅

Django 템플릿 위치와 관련하여 두 가지 중요한 셋팅이 있는데, Django 프로젝트의 settings.py 안의 TEMPLATES 셋팅 중 DIRS 와 APP_DIRS 옵션이 그것이다.

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [ os.path.join(BASE_DIR, 'templates') ],  # 추가
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

DIRS 옵션은 Django가 템플릿들을 찾는 디렉토리 경로를 지정하는 것으로, 원래는 비어 있었는데, 위의 같이 Base 디렉토리(BASE_DIR) 밑의 templates 폴더 경로를 추가하였다. 즉, BASE_DIR\templates 가 경로에 추가되어야만 base.html 템플릿을 찾을 수 있게 된다. 만약 DIRS에 여러 경로가 추가되면, Django는 경로 순서대로 검색하면서 템플릿을 찾게 된다.

APP_DIRS 옵션은 Django가 Django App 안의 templates 폴더에서 템플릿들을 찾을 것인지의 여부를 설정하는 것이다. 디폴트로 True가 설정되어 있어서 기본적으로 App안의 templates 폴더를 검색하여 템플릿을 찾게 된다.

Python 프로그래밍 실습

본 웹사이트는 광고를 포함하고 있습니다. 광고 클릭에서 발생하는 수익금은 모두 웹사이트 서버의 유지 및 관리, 그리고 기술 콘텐츠 향상을 위해 쓰여집니다.