완숙의 블로그

[Django] Week 4.5 - Template 상속, URL 관리 본문

Programing Language/Web_Django

[Django] Week 4.5 - Template 상속, URL 관리

완숙 2019. 3. 9. 11:32

템플릿 상속

Html 상에서 겹치는 내용(Nav bar)

이런 내용들을 새로운 녀석을 만들 때 항상 붙여줘야 될까?

 

아니!

base.html 같은 것에 기본 틀은 다 넣어두고,

새로운 녀석에는 다른 것만 넣자.

이게 템플릿 상속

 

장점

코드 재사용,

일관된 UI 구성 및 변경이 용이하다.

 

 

템플릿 상속의 구현

  1. 프로젝트 폴더templates 폴더 만들기
  1. templates 폴더에 base.html 만들기
  1. base.html 에 내용채워 넣기
  1. settings.pybase.html 위치 알려주기

 

 

실습

  1. 프로젝트 폴더에 base.html 만들기

    blog나, portfolio 앱에서가 아닌 프로젝트 전반에 먹일거니까 프로젝트폴더에 만들어야한다!

    이렇게

    2019-03-03 1 43 03

    2019-03-03 1 44 32

     

  2. 이건 없던 폴더이니까, 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',
                ],
            },
        },
    ]
    

     

     

  3. 여기에 이 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',
                ],
            },
        },
    ]
    

     

  4. 이제 base.html 에 겹치는 녀석을 붙이자.

    즉, navbar!

    <head> 태그 가져오고, <body> 태그 닫아주자!

     

  5. 자, 그런데 여기서 끝난게 아니고, body 태그를 닫기전에 장고한테, 여기서 부터는

    내가 만든 다른녀석이 올거야!

    라고 알려줄 필요가 있다.

    <!-- base.html -->
    <body>
        
    blahblah.....
    
    {% block contents %}
    {% endblock %}
    
    </body>
    

     

  1. 이제 겹치는 부분을 지우자.

    대신, home.html 에는 base.html 을 불러오겠다는 명령어를 적어주어야 한다.

    <!-- home.html -->
    {% extends 'base.html' %}
    
    blahblah..
    

     

  2. 그런데 여기서 아까 base.html 에서 {% block contents %} 로 끝났으므로,

    우리가 home.html 에서 넣어줄 부분이 곧 contents 를 의미한다.

    그래서 템플릿 코드로 이를 연결시켜주는데,

    <!-- home.html -->
    {% block contents %}
    ...
    {% endblock %}
    

     

  3. 끝!

 

 

URL 관리

지금 진행하고 있는, secondproject는 blog, portfolio 라는 두개의 앱으로

작동하고 있다.

그런데, 이것보다 큰 프로젝트의 경우에는 앱이 엄청나게 많아질 수 있다.

이런 경우 이 app으로 접근하게 하는 URL은 프로젝트 최상단폴더의 urls.py 에서 관리한다.

그런데, 너무 지저분해지는 것 아닌가?

 

2019-03-03 2 02 21

# 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를 해서 사용하는 방식으로 바꾸자!

 

실습

  1. blog 앱 폴더안에 urls.py 라는 녀석을 새로 만들자!

    이렇게!

    2019-03-03 2 08 38

     

  2. 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 앱과 관련된 놈들만 빼오고 싶으니까, 표시된 부분만 가져오자.

     

  3. 정리하면,

    # 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"),
    ]
    

     

  4. 이제, 우리는 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"),
    ]
    

     

  5. 그리고 이쪽으로 url을 옮겼으니 기존에 있는 녀석을 지우자.

     

  6. 이제 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/ 를 붙이는 걸로 할게!

     

  7. 끝!

Comments