Django 템플릿

Ethan·2023년 12월 26일
0

django

목록 보기
10/28

지난 포스팅에서 views.py 를 아래와 같이 정의했다.

def index(request): 
	return HttpResponse("<h2>안녕</h2>")  📌http 객체를 생성하고 <h2>안녕</h2>을 문자열을 넣어 반환해라

요약하자면, 127.0.0.1:8000/APP1/index 로 접속하면 index 함수를 통해 '안녕' 이 출력된 페이지로 응답하는 것이다.


만약 더 많은 내용이 담긴 html 을 반환해야 한다면?

views.py 파일에 모두 작성하기에는 코드의 길이가 길어지고, 지저분할 것이다. 따라서 views.py의 함수가 html 요소를 포함하는 것은 한계가 있다. 장고에서 html 과 같이, 화면 구성을 담당하는 부분을 template 이라 하며, template 기능을 활용하면 더 복잡하고, 많은 내용이 담긴 화면 구성을 별도로 관리할 수 있다.


Templates 디렉토리 생성하기

template 기능을 활용하기 위해 앱 디렉토리 내부에 templates 디렉토리를 생성한다.

📂ABC
    📄manage.py
    📄db.sqlite3
    📂ABC
        📄__init__.py
        📄settings.py
        📄urls.py
        📄wsgi.py
    📂APP1
    	📂templates  📌생성한 템플릿 디렉토리
        📂migrations
        📄__init__.py
        📄admin.py
        📄apps.py
        📄models.py
        📄tests.py
        📄views.py
        📄urls.py

이후 templates 디렉토리 내부에 앱 디렉토리와 같은 이름의 디렉토리를 생성하며, 이를 샌드위치 구조라고 한다.

📂ABC
    📄manage.py
    📄db.sqlite3
    📂ABC
        📄__init__.py
        📄settings.py
        📄urls.py
        📄wsgi.py
    📂APP1
    	📂templates  
        	📂APP1  📌템플릿 디렉토리 내부에 생성된 앱 디렉토리와 같은 이름의 디렉토리
        📂migrations
        📄__init__.py
        📄admin.py
        📄apps.py
        📄models.py
        📄tests.py
        📄views.py
        📄urls.py

html 파일 생성하기

샌드위치 구조 가장 안쪽 디렉토리html 파일을 생성한다.

📂ABC
    📄manage.py
    📄db.sqlite3
    📂ABC
        📄__init__.py
        📄settings.py
        📄urls.py
        📄wsgi.py
    📂APP1
    	📂templates  
        	📂APP1  
            	📄index.html 📌생성한 html 파일
        📂migrations
        📄__init__.py
        📄admin.py
        📄apps.py
        📄models.py
        📄tests.py
        📄views.py
        📄urls.py

html 파일 작성하기

index.html 파일의 내용을 작성한다.

<h2>평화로운 마을의 아침</h2>
<p>
  어느 평화로운 마을의 이른 아침, 새들의 지저귐이 부드럽게 울려 퍼지며,<br>
  햇살이 창문을 통해 스며들어 온 방을 환하게 밝혀줍니다.<br>
  사람들은 잠에서 깨어나 하루를 시작하고, 아이들은 학교로 가는 길에 즐겁게 뛰어놉니다.<br>
  마을 곳곳에서는 사람들이 서로 인사를 나누며, 작은 가게들은 아침 준비를 시작합니다. <br>
  모든 것이 평온하고, 마음은 기쁨으로 가득 차 있습니다.
</p>

views.py 파일 수정하기

기존에 작성된 html 요소를 포함한 views.pyindex 함수를 html 파일을 불러오는 함수로 수정한다.

from django.shortcuts import render
from django.http import HttpResponse  
    
def index(request):  📌변경된 index 함수
	return render(request, 'APP1/index.html')

index 함수 가 기존 HttpResponse 함수에서 render 함수로 변경되었다. render 함수는 넘겨준 request와 templates를 토대로 응답, 즉 HttpResponse 객체를 생성해 반환하는 기능을 한다.


왜 샌드위치 구조일까?

템플릿, 정적파일(css, font, image)은 샌드위치 구조로 관리해야 한다. 그 이유를 알기 위해 프로젝트 구성 디렉토리settings.py 파일을 살펴보자

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [],
        'APP_DIRS': True,  📌각각의 앱에 템플릿 디렉토리가 있으니 찾으라는 설정
        'OPTIONS': {
        },
    },
]

settings.pyTEMPLATES 항목을 보면 'APP_DIRS': True가 있다. 이는 각각의 앱에 템플릿 디렉토리가 있으니 찾아서 사용하라는 의미다. 그렇다면 장고는 이를 어떻게 해석할까? 자세한 설명을 위해 settings.pyINSTALLED_APPS 을 살펴보자

INSTALLED_APPS = [
	'django.contrib.admin',
	'django.contrib.auth',
	'django.contrib.contenttypes',
	'django.contrib.sessions',
	'django.contrib.messages',
	'django.contrib.staticfiles',
	'APP1',  📌상단에 등록된 앱
    'APP2',
]

INSTALLED_APPS을 살펴보면 APP1APP2 앱이 적용되어 있다. 장고는 등록된 앱 순서에 따라 하나하나 index.html 파일을 찾는다. 따라서 APP1index.htmlAPP2index.html 중 상단에 등록된 앱의 index.html 파일을 사용하게 된다. 샌드위치 구조는 templates 디렉토리 내에 앱 이름과 일치하는 디렉토리를 추가함으로서 이런 문제를 방지한다.

profile
글로 쓰면 머리 속에 정리가 되...나?

0개의 댓글

관련 채용 정보