Leta Learns

django | template 상속, 앱 분리 본문

Django

django | template 상속, 앱 분리

leta 2021. 7. 7. 13:32

template 상속

: 기반이 되는 하나의 template을 만들고, 그것을 기반으로 다른 html을 작성하는 기법

      => base.html (project 폴더 안에 templates 폴더 생성한 후 base.html 작성)

                         (그동안 앱 안에 templates 만들어줬던 거랑 다름)

 

 

{% block content %}
{% endblock %}

=> 장고 내장 명령어. block content와 endblock 사이에 페이지마다 필요한 정보가 들어감.

 

 

base.html 생성한 후에 장고에게 생성했다고 알려줘야 함.

  1. project폴더에 있는 settings.py
  2. TEMPLATES에서 'DIRS'에 빈 리스트가 있는데 해당 리스트에 base.html의 경로 넣기.

         => [프로젝트 폴더명]/templates  #경로

              (BASE_DIR/ 'templates') #이렇게 써도 됨!

더보기

BASE_DIR : 전체 프로젝트 루트 디렉토리

=> 현재 BASE_DIR이 modelproject이기 때문에 BASE_DIR/templates == modelproject/templates

 

 

상속받을 수 있도록 home.html 수정하기.

=> 중복된 html, header, body, nav 태그를 base.html에 추가했으므로 home.html에서는 삭제해준다.

      (body태그 전까지 그냥 다 지우고 {% block content %}와 {% endblock %} 사이에 내용 작성

 

{% extends 'base.html' %} 

 #base.html 상속받기, 반드시 html 파일의 첫째 줄에 위치해야 함. 안 그러면 에러.

 

 


 

 

APP 분리

기능이 추가되고 앱이 다양해질수록 path가 더 많아짐 => 가독성 bad, 무거워짐

=> app별로 url을 관리하는 것이 효과적!

 

1. 앱/urls.py 생성

# app폴더 urls.py
# urls.py에서 blog앱에서 사용하는 url을 모두 가져옵니다.

from django.urls import path
from . import views  # 현재 폴더에 있는 views에 접근하기 때문

app_name = 'blog'  # app_name에는 앱 이름을 넣어줍니다.

urlpatterns = [
    path('<int:id>', views.detail, name='detail'),
    path('new/', views.new, name='new'),
    path('create/', views.create, name='create'),
    path("update/<int:id>", views.update, name="update"),
    path('delete/<int:id>', views.delete, name="delete"),
]

 

      app_name에는 앱 이름 적기 (=> 요청 url과 각각의 앱에 속하는 path를 매핑하기 위해)

 

 

2. 프로젝트/urls.py 수정

from django.contrib import admin
from django.urls import path, include # include 작업을 분리해서 앱의 urls.py로 넘겨준다
import blog.views

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', blog.views.home, name='home'),
    path('blog/', include('blog.urls'))
]

=> 요청이 blog 앱 내에서 정의된 url을 타게 된다.

 

 

home.html

{% extends 'base.html' %}
  {% block content %}
    <h1>Blog Project</h1>
    <h4><a href="{% url 'blog:new' %}">New Post</a></h4>

      {% for blog in blogs%}
      <div>
        <h3>{{ blog.title }}</h3>
        {{ blog.id }} <br />
        {{ blog.writer }} <br />
        {{ blog.summary }}
        <a href="{% url 'blog:detail' blog.id %}">...more</a>
      </div>
      {% endfor %}
  {% endblock %}

home으로 가는 경로는 프로젝트/urls.py에 정의되어있으므로 경로 붙일 필요 x

 

 

detail.html

{% extends 'base.html' %}
{% block content %}
    <h1>{{ blog.title }}</h1>
    <p>{{ blog.pub_date }}</p>
    <p>{{ blog.body }}</p>
        {% if blog.image %}
        <img src="{{blog.image.url}}" alt="" />
        {% endif %}
    <a href="{% url 'update' blog.id %}">수정하기</a>
    <a href="{% url 'home' %}">돌아가기</a>
    <a href="{% url 'delete' blog.id %}">Delete Post</a>
{% endblock %}

장고는 url 요청이 들어오면 urls.py의 urlpatterns에 있는 내용과 비교하여 view로 연결해준다.

  1. url 요청이 들어오면 먼저 프로젝트/urls.py에서 urlpatterns 매칭
  2. 'blog/'로 시작되는 요청이면 blog/urls.py (앱/urls.py)에 매칭해서 view로 넘겨준다. 

=> 앱 별로 url 분리 => 프로젝트/urls.py가 좀 더 깔끔해지고 path 관리 용이

 

 

* 앱/urls.py에 정의된 경로는 모두 바꿔줘야 함.

  ex) views.py create 함수에서 blog에 create 하는 것이므로 'blog:detail'로 redirect

 

 

 

'Django' 카테고리의 다른 글

django | Media 파일  (0) 2021.07.08
django | Static 파일  (0) 2021.07.07
django | CRUD - Delete  (0) 2021.07.07
django | CRUD - Update  (0) 2021.07.07
django | CRUD - Create  (0) 2021.07.07
Comments