Django App 의 Template 구조가 어떤 식으로 작용하는가?
이런 식으로 할 꺼면 그냥 app/templates/index.html
로 하면 안 되는 건가?
Intro
아마 Django
를 처음 시작하는 사람들은 대부분 Django
의 Official Site에 있는 Tutorial. polls app 만들기를 접해보았을 것이다. 거기 예제를 따라가다보면 template 관련한 내용이 나오는데 주로 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.py
의INSTALLED_APP
리스트의 앞 앱부터 template을 검색해나가고 일치하는 템플릿이 있다면 거기서 멈추고 그 템플릿을 선택합니다.
( 사진 설명 - tutorial
App과 sub
App 존재.
tutorial/index.html
, sub/index.html
존재.
html file의 이름이 같다면, settings.py
의 INSTALLED_APPS
순서에 따라 앞의 앱의 template이 검색되어 제공됨. )
그렇기 때문에 주로 templates 디렉토리 하위에 app 이름의 디렉토리를 두어 namespace
가 명확해지도록 하기 위해 그런 것이 아닐까 싶습니다.
중요한 것은 그 앱의 templates directory가 namespace
로서 우선적인 검색 후보가 되는 것이 아니라 settings.py
의 INSTALLED_APPS
리스트의 순서대로 우선적으로 template을 검색한다는 것입니다.
그렇기 때문에 각 앱 별로 templates/{{app_name}}/index.html
로 설정하는 것이 적절해진 것 같습니다.
하지만 꼭 그러진 않아도 된다고 앞서 말했듯이, 편의에 따라서는 아래 예시처럼 이용할 수 있습니다.
(경로 -> template을 이용할 때 사용되는 문자열 순서로 나타냄. app_name
은 tutorial
이라는 가정하.)
예시
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"
'Python > Frameworks.Libraries' 카테고리의 다른 글
[Django] Django에서 static 과 media 이용하기. DEBUG=False일 때 static (0) | 2019.09.22 |
---|---|
docker-compose를 통해 Nginx, Django 연동하기 2 - Django App과 uWSGI 연동하기 (0) | 2019.09.08 |
Django 테이블 삭제하는 방법. django.db.utils.OperationalError: no such table 오류 해결 방법 (0) | 2019.09.01 |
docker-compose를 통해 Nginx, Django 연동하기 1 - 간단한 Django app 만들기 (0) | 2019.07.22 |
웹서버를 짜주는 Django 에서 프로젝트를 구성하는 방식 (0) | 2019.06.29 |