본문 바로가기

Python/Frameworks.Libraries

Django App Templates Directory. 장고 앱 템플릿 디렉토리 구조에 대해

Django App Template 구조가 어떤 식으로 작용하는가?

보통 추천되는 django template directory structure

이런 식으로 할 꺼면 그냥 app/templates/index.html로 하면 안 되는 건가?

Intro

아마 Django를 처음 시작하는 사람들은 대부분 Django 의 Official Site에 있는 Tutorial. polls app 만들기를 접해보았을 것이다. 거기 예제를 따라가다보면 template 관련한 내용이 나오는데 주로 template directory structure를 아래와 같은 식으로 쌓는다.

보통 추천되는 django template directory structure

근데 나는 처음에 Django 를 시작할 때부터 궁금했다. 예를 들어 app 이름이 tutorial 이면

tutorial/templates/tutorial/index.html처럼 앱의 이름이 2번 등장해야하는가 말이다.

다른 예제를 찾아봐도 죄다 {{app_name}}/templates/{{app_name}}/ 에다가 html file을 저장한다. ( project 우선의 template directory 구조를 제외할 경우. )

그리고 다른 App의 template을 참조하는 것에 대해서도 느낌적으로 의아한 부분들이 존재해서 한 번 정리해봅니다. 이 내용은 어디 딱히 정리되어있는 것 같지도 않고 검색어도 애매해서 찾아보기 힘들었습니다. ( 즉 약간 뇌피셜임 )

( django template directory structure 라고 검색해도 주로 template 언어나 extends 관련 내용이 많은 듯 )

  • 기본적으로 장고에서는 Project가 존재하고 Project 하위에 App들이 존재합니다. 따라서 이 글에서의 App이라는 말과 Project라는 말을 혼동하지마시길 바래요
  • https://docs.djangoproject.com/en/2.2/howto/overriding-templates/ 를 보시면 아시겠지만 장고 템플릿 디렉토리를 구성하는 두 가지 방식이 있는데, 이 글은 프로젝트가 아닌 디폴트인 앱 기반 템플릿 디렉토리를 이용합니다.

{{app_name}}/templates 안에 또 {{app_name}} 디렉토리를 만들고 html을 저장하는가?

내가 알아본 바에 의해 결론부터 말하자면 애초에 꼭 그러진 않아도 된다.이다.

하지만 이러한 방식을 권장은 하는 것 같다.

즉 template을 찾기 위한 경로에서 첫 번째로 App이름이 오고 두 번째로 하위 디렉토리나 html 파일이 오는 것이 가장 나아보인다.

만약 단일 앱으로만 이루어진 프로젝트를 구성한다면 바로 {{app_name}}/tempates/index.html 이런 식으로 구성해도 되겠지만, 애초에 대부분은 여러 앱에 같은 이름의 html file이 존재하기도하죠. 예를 들면 index.html, login.html.

그럼 만약 내 앱 이름이 tutorial1 과 tutorial2가 있다고 합시다.

tutorial1/templates/index.html, tutoria2/templates/index.html 이 모두 존재하면 template을 참조할 때 쓰이는 경로로서의 문자열은 'index.html' 이 될 것인데, 장고는 이 때 tutorial1의 index.html을 참조할 지 tutorial2의 것을 참조할 지 모르기 때문에

settings.pyINSTALLED_APP 리스트의 앞 앱부터 template을 검색해나가고 일치하는 템플릿이 있다면 거기서 멈추고 그 템플릿을 선택합니다.

( 사진 설명 - tutorial App과 sub App 존재.

tutorial/index.html, sub/index.html 존재.

html file의 이름이 같다면, settings.pyINSTALLED_APPS 순서에 따라 앞의 앱의 template이 검색되어 제공됨. )

그렇기 때문에 주로 templates 디렉토리 하위에 app 이름의 디렉토리를 두어 namespace가 명확해지도록 하기 위해 그런 것이 아닐까 싶습니다.

중요한 것은 그 앱의 templates directory가 namespace로서 우선적인 검색 후보가 되는 것이 아니라 settings.pyINSTALLED_APPS 리스트의 순서대로 우선적으로 template을 검색한다는 것입니다.

그렇기 때문에 각 앱 별로 templates/{{app_name}}/index.html로 설정하는 것이 적절해진 것 같습니다.

하지만 꼭 그러진 않아도 된다고 앞서 말했듯이, 편의에 따라서는 아래 예시처럼 이용할 수 있습니다.

(경로 -> template을 이용할 때 사용되는 문자열 순서로 나타냄. app_nametutorial이라는 가정하.)

예시

Best : tutorial/templates/tutorial/index.html -> "tutorial/index.html"

tutorial/templates/index.html -> "index.html"

tutoria/templates/tutorial/example/index.html -> "tutorial/example/index.html"