일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- DFS
- codetree
- 동적계획법
- 모각코
- 최소스패닝트리
- minimum spanning tree
- 마라마라빔
- 파이썬
- 알고리즘
- 코드트리
- 소프트웨어공학
- 백준
- programmers
- Bellman-Ford
- 프로그래머스
- 실습
- BFS
- 백트래킹
- SQL
- django
- MyPlaylist
- 함밥
- 종합설계
- Kruskal
- 장고
- B대면노래방
- 데이터베이스
- 그리디알고리즘
- Planned
- DP
- Today
- Total
Leta Learns
django | template 상속, 앱 분리 본문
template 상속
: 기반이 되는 하나의 template을 만들고, 그것을 기반으로 다른 html을 작성하는 기법
=> base.html (project 폴더 안에 templates 폴더 생성한 후 base.html 작성)
(그동안 앱 안에 templates 만들어줬던 거랑 다름)
{% block content %}
{% endblock %}
=> 장고 내장 명령어. block content와 endblock 사이에 페이지마다 필요한 정보가 들어감.
base.html 생성한 후에 장고에게 생성했다고 알려줘야 함.
- project폴더에 있는 settings.py
- 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로 연결해준다.
- url 요청이 들어오면 먼저 프로젝트/urls.py에서 urlpatterns 매칭
- '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 |