템플릿 상속
Html 상에서 겹치는 내용(Nav bar)
이런 내용들을 새로운 녀석을 만들 때 항상 붙여줘야 될까?
아니!
base.html 같은 것에 기본 틀은 다 넣어두고,
새로운 녀석에는 다른 것만 넣자.
이게 템플릿 상속
장점
코드 재사용,
일관된 UI 구성 및 변경이 용이하다.
템플릿 상속의 구현
- 프로젝트 폴더에
templates
폴더 만들기
templates
폴더에base.html
만들기
base.html
에 내용채워 넣기
settings.py
에base.html
위치 알려주기
실습
프로젝트 폴더에 base.html 만들기
blog나, portfolio 앱에서가 아닌 프로젝트 전반에 먹일거니까 프로젝트폴더에 만들어야한다!
이렇게
이건 없던 폴더이니까,
settings.py
에 알려줘야 한다.여기서
TEMPLATES
라고 되어있는 리스트를 찾아가자.거기보면
DIRS
라고 되어 있고 공란으로 되어있을 것이다.# settings.py TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': [], # 이 부분! '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', ], }, }, ]
여기에 이
base.html
의 경로를 적어주면 된다.# settings.py TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': ['secondproject/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', ], }, }, ]
이제
base.html
에 겹치는 녀석을 붙이자.즉, navbar!
꼭
<head>
태그 가져오고,<body>
태그 닫아주자!자, 그런데 여기서 끝난게 아니고, body 태그를 닫기전에 장고한테, 여기서 부터는
내가 만든 다른녀석이 올거야!
라고 알려줄 필요가 있다.
<!-- base.html --> <body> blahblah..... {% block contents %} {% endblock %} </body>
이제 겹치는 부분을 지우자.
대신,
home.html
에는base.html
을 불러오겠다는 명령어를 적어주어야 한다.<!-- home.html --> {% extends 'base.html' %} blahblah..
그런데 여기서 아까
base.html
에서{% block contents %}
로 끝났으므로,우리가
home.html
에서 넣어줄 부분이 곧 contents 를 의미한다.그래서 템플릿 코드로 이를 연결시켜주는데,
<!-- home.html --> {% block contents %} ... {% endblock %}
끝!
URL 관리
지금 진행하고 있는, secondproject는 blog, portfolio 라는 두개의 앱으로
작동하고 있다.
그런데, 이것보다 큰 프로젝트의 경우에는 앱이 엄청나게 많아질 수 있다.
이런 경우 이 app으로 접근하게 하는 URL은 프로젝트 최상단폴더의 urls.py
에서 관리한다.
그런데, 너무 지저분해지는 것 아닌가?
# urls.py
urlpatterns = [
path('admin/', admin.site.urls),
path('', blog.views.home, name = "home"),
path('blog/<int:blog_id>', blog.views.detail, name = "detail"),
path('blog/new', blog.views.new, name = "new"),
path('blog/create', blog.views.create, name = "create"),
path('portfolio/', portfolio.views.portfolio, name = "portfolio"),
] + static(settings.MEDIA_URL, document_root = settings.MEDIA_ROOT)
두개만 해도 뭔가 복잡하다..
관리법
그럼 어떻게?
urls.py
에 적혀있는 path들을 잘보면, 특정 앱에 해당하는 기능을 수행하는 경우에는
모두 앞에 app 이름이 적혀있는 것을 볼 수 있다.
그러니까, 이제부터는 app안에서 각가의 경로를 설정해주고,
이것을 urls.py
에서 import를 해서 사용하는 방식으로 바꾸자!
실습
blog 앱 폴더안에
urls.py
라는 녀석을 새로 만들자!이렇게!
blog.urls.py
안에 프로젝트 폴더에 있던 urls.py 내용을 넣을 건데,# urls.py from django.contrib import admin #### from django.urls import path #### import blog.views #### import portfolio.views from django.conf import settings from django.conf.urls.static import static urlpatterns = [ path('admin/', admin.site.urls), path('', blog.views.home, name = "home"), path('blog/<int:blog_id>', blog.views.detail, name = "detail"), #### path('blog/new', blog.views.new, name = "new"), #### path('blog/create', blog.views.create, name = "create"), #### path('portfolio/', portfolio.views.portfolio, name = "portfolio"), ] + static(settings.MEDIA_URL, document_root = settings.MEDIA_ROOT)
여기서 우리는 blog 앱과 관련된 놈들만 빼오고 싶으니까, 표시된 부분만 가져오자.
정리하면,
# blog.urls.py from django.contrib import admin from django.urls import path import blog.views # or from . import views . 은 현재 폴더를 말함. urlpatterns = [ path('blog/<int:blog_id>', blog.views.detail, name = "detail"), path('blog/new', blog.views.new, name = "new"), path('blog/create', blog.views.create, name = "create"), ]
이제, 우리는 blog 폴더 안에서 url을 작성할 거니까,
굳이 절대 경로( ex)
blog/new
) 를 써줄 필요가 없다.# blog.urls.py from django.contrib import admin from django.urls import path import blog.views # or from . import views . 은 현재 폴더를 말함. urlpatterns = [ path('<int:blog_id>', views.detail, name = "detail"), path('new', views.new, name = "new"), path('create', views.create, name = "create"), ]
그리고 이쪽으로 url을 옮겼으니 기존에 있는 녀석을 지우자.
이제
second project.urls.py
에서 옮긴 녀석을 가져와야 한다.결국 우리가 필요한 것은,
blog.urls.py
로 갈 path 를 이녀석한테 알려줘야한다.그래서, 이렇게 써준다.
# secondproject.urls.py from django.contrib import admin from django.urls import path, include ######################## 이거 꼭 해줘야함!!!!!!! import blog.views import portfolio.views from django.conf import settings from django.conf.urls.static import static urlpatterns = [ path('admin/', admin.site.urls), path('', blog.views.home, name = "home"), path('blog/', include('blog.urls')), #### 이 부분, 컴마 조심 path('portfolio/', portfolio.views.portfolio, name = "portfolio"), ] + static(settings.MEDIA_URL, document_root = settings.MEDIA_ROOT)
blog 폴더에 있는, urls.py 를 include 해와!
이 녀석들의 path는 앞에
blog/
를 붙이는 걸로 할게!끝!