이번에는 앱별로 템플릿 디렉토리를 만들어서 관리하는 방법에 대해서 알아보겠습니다.
settings.py 파일의 INSTALLED_APPS 변수에 그 커스텀 Django 앱을 등록해야 합니다.
1단계
- 새로운 Django 앱 생성 - manage.py startapp "앱이름"
- 앱 내에서 urls.py을 열고, views.py를 생성합니다.
- 뷰를 특정 URL에 연결하고, 실제 앱 URL을 프로젝트 URL에 매핑
2단계 - 데이터베이 테이블과 모델에 대한 작업
- migrate 명령인 'python manage.py migrate'를 실행 - settings.py 내부의 설치된 앱(INSTALLED_APPS)을 살펴보고, 필요한 데이터베이스 테이블을 생성합니다.
3단계 - 프로젝트가 앱폴더를 인식하게 연결(앱 내부의 템플릿 폴더를 인식하게 설정)
- Django 앱 내부에 자동생성된 apps.py 파일을 확인 후, 프로젝트용 settings.py 내부의 INSTALLED_APPS에 AppConfig 클래스를 등록, 즉, 2단계에서 데이터베이스 테이블과 모델에 대한 작업을 수행하고, 3단계에서는 프로젝트가 앱 디렉토리를 인식할 수 있도록 연결을 수행하여, 앱 내부의 템플릿 디렉토리를 인식 시키기.
- apps.py를 열면 AppConfig와 유사한 것을 볼 수 있는데, 이부분의 코드 한 줄을 가져 와서, INSTALLED_APPS 리스트에 붙여넣는 겁니다.
4단계 - Django에 앱과 모든 데이터베이스 변경 사항을 등록
- python manage.py makemigrations my_app 명령으로 Django에 앱과 모든 데이터베이스 변경 사항을 등록.
- 실제로 모델을 생성할 때까지는 그다지 관련성이 없지만, 일반적인 업무절차상이니 진행한다.
5단계 - python manage.py migrate를 다시 실행(3,4 단계에서 추가된 사항들만 적용함)
6단계 - 앱 디렉토리의 내부에 템플릿 디렉토리를 생성 - first_app 내부에 templates 폴더가 있는데, 템플릿폴더 내부에 다시 first_app 폴더를 만들어야 한다. Django 가 템플릿 이름을 검색하는 방식 때문에 템플릿 폴더 내부에 "앱이름과 같은 폴더" 를 하나 더 만들어 줘야 한다(그래서 여기서는 first_app 이란 폴더가 반복된).
실제 코딩 예시를 보면 단계별 진행상황을 쉽게 이해할 수 있습니다.
- 1단계 - 새로운 프로젝트와 장고앱 생성
(django) D:\workspace\Python\Django\DJANGO4\DJANGO_COURSE_V2\07-Django-and-Templates>django-admin startproject my_site
(django) D:\workspace\Python\Django\DJANGO4\DJANGO_COURSE_V2\07-Django-and-Templates>dir
D 드라이브의 볼륨: OS_WORK
(django) D:\workspace\Python\Django\DJANGO4\DJANGO_COURSE_V2\07-Django-and-Templates>cd my_site
(django) D:\workspace\Python\Django\DJANGO4\DJANGO_COURSE_V2\07-Django-and-Templates\my_site>dir
D 드라이브의 볼륨: OS_WORK
볼륨 일련 번호: 9C64-09D3
D:\workspace\Python\Django\DJANGO4\DJANGO_COURSE_V2\07-Django-and-Templates\my_site 디렉터리
2022-10-25 오후 03:44 <DIR> .
2022-10-25 오후 03:44 <DIR> ..
2022-10-25 오후 03:44 685 manage.py
2022-10-25 오후 03:44 <DIR> my_site
1개 파일 685 바이트
3개 디렉터리 115,535,540,224 바이트 남음
(django) D:\workspace\Python\Django\DJANGO4\DJANGO_COURSE_V2\07-Django-and-Templates\my_site>python manage.py startapp my_app
(django) D:\workspace\Python\Django\DJANGO4\DJANGO_COURSE_V2\07-Django-and-Templates\my_site>dir
D 드라이브의 볼륨: OS_WORK
볼륨 일련 번호: 9C64-09D3
D:\workspace\Python\Django\DJANGO4\DJANGO_COURSE_V2\07-Django-and-Templates\my_site 디렉터리
2022-10-25 오후 03:45 <DIR> .
2022-10-25 오후 03:44 <DIR> ..
2022-10-25 오후 03:44 685 manage.py
2022-10-25 오후 03:45 <DIR> my_app
2022-10-25 오후 03:45 <DIR> my_site
1개 파일 685 바이트
4개 디렉터리 115,535,532,032 바이트 남음
(django) D:\workspace\Python\Django\DJANGO4\DJANGO_COURSE_V2\07-Django-and-Templates\my_site>
초기 생성버전에는 장고앱 폴더에 urls.py 파일이 없는것을 볼 수 있다.
앱레벨의 urls.py 생성 및 views.py 수정, 그리고 프로젝트레벨의 urls.py 수정
여기에서는) views 내부에서 render 할 html 생성하지 않은 상태임.
- 2단계 - migrate 실행
(django) D:\workspace\Python\Django\DJANGO4\DJANGO_COURSE_V2\07-Django-and-Templates\my_site>python manage.py migrate
Operations to perform:
Apply all migrations: admin, auth, contenttypes, sessions
Running migrations:
Applying contenttypes.0001_initial... OK
Applying auth.0001_initial... OK
Applying admin.0001_initial... OK
Applying admin.0002_logentry_remove_auto_add... OK
Applying admin.0003_logentry_add_action_flag_choices... OK
Applying contenttypes.0002_remove_content_type_name... OK
Applying auth.0002_alter_permission_name_max_length... OK
Applying auth.0003_alter_user_email_max_length... OK
Applying auth.0004_alter_user_username_opts... OK
Applying auth.0005_alter_user_last_login_null... OK
Applying auth.0006_require_contenttypes_0002... OK
Applying auth.0007_alter_validators_add_error_messages... OK
Applying auth.0008_alter_user_username_max_length... OK
Applying auth.0009_alter_user_last_name_max_length... OK
Applying auth.0010_alter_group_name_max_length... OK
Applying auth.0011_update_proxy_permissions... OK
Applying auth.0012_alter_user_first_name_max_length... OK
Applying sessions.0001_initial... OK
(django) D:\workspace\Python\Django\DJANGO4\DJANGO_COURSE_V2\07-Django-and-Templates\my_site>
- 3단계 - 프로젝트가 앱폴더를 인식하게 연결(앱 내부의 템플릿 폴더를 인식하게 설정)
# 장고앱 레벨의 apps.py 파일내용
from django.apps import AppConfig
class MyAppConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = 'my_app'
# 장고앱 레벨의 apps.py 파일에서 정보를 확인한 후, 프로젝트 레벨의 settings.py 파일에 추가
INSTALLED_APPS = [
'my_app.apps.MyAppConfig', # <=== 이부분 추가함
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
]
- 4단계 - Django에 앱과 모든 데이터베이스 변경 사항을 등록 - my_app 에서 모델을 추가하지 않아서 특이사항 없음.
(django) D:\workspace\Python\Django\DJANGO4\DJANGO_COURSE_V2\07-Django-and-Templates\my_site>
(django) D:\workspace\Python\Django\DJANGO4\DJANGO_COURSE_V2\07-Django-and-Templates\my_site>python manage.py makemigrations my_app
No changes detected in app 'my_app'
# 지금은 어떤 모델도 가지고 있지 않기 때문에 이런 문구가 출력됩니다
# my_app 앱에서 변경 사항을 감지하지 못했습니다
# 나중에 실제 모델과 디비에 변경 사항이 있다면 관련 정보를 볼수 있습니다
(django) D:\workspace\Python\Django\DJANGO4\DJANGO_COURSE_V2\07-Django-and-Templates\my_site>
- 5단계 - python manage.py migrate를 다시 실행 - 현재는 변경사항이 없어서 아무런 변화가 없습니다. 3,4 단계에서 모델을 추가하면 추가된 부분이 적용되는 로그를 볼수 있음.
(django) D:\workspace\Python\Django\DJANGO4\DJANGO_COURSE_V2\07-Django-and-Templates\my_site>python manage.py migrate
Operations to perform:
Apply all migrations: admin, auth, contenttypes, sessions
Running migrations:
No migrations to apply.
(django) D:\workspace\Python\Django\DJANGO4\DJANGO_COURSE_V2\07-Django-and-Templates\my_site>
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [],
'APP_DIRS': True, # <=== 이부분이 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',
],
},
},
]
- 6단계 - 앱 디렉토리의 내부에 템플릿 디렉토리를 생성
./my_site/my_app/views.py 수정
from django.shortcuts import render
# Create your views here.
def example_view(request):
# my_app/templates/my_app/example.html
# render 내부의 폴더는 상기 주석의 후반부 의미함. 전반부는 프로젝트의 settings.py 에서 설정함
return render(request, 'my_app/example.html')
./my_site/my_app/urls.py 생성.
from django.urls import path
from . import views
urlpatterns = [
path('', views.example_view), # domain.com/my_app
]
./my_site/my_site/urls.py 수정
"""my_site URL Configuration
The `urlpatterns` list routes URLs to views. For more information please see:
https://docs.djangoproject.com/en/4.1/topics/http/urls/
Examples:
Function views
1. Add an import: from my_app import views
2. Add a URL to urlpatterns: path('', views.home, name='home')
Class-based views
1. Add an import: from other_app.views import Home
2. Add a URL to urlpatterns: path('', Home.as_view(), name='home')
Including another URLconf
1. Import the include() function: from django.urls import include, path
2. Add a URL to urlpatterns: path('blog/', include('blog.urls'))
"""
from django.contrib import admin
from django.urls import include, path
urlpatterns = [
path('my_app/', include('my_app.urls')),
path('admin/', admin.site.urls),
]
./my_site/my_app/templates/my_app/example.html 만들기
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<h1>Example HTML template connected ~~~</h1>
</body>
</html>
- 서버 실행 후 확인
(django) D:\workspace\Python\Django\DJANGO4\DJANGO_COURSE_V2\07-Django-and-Templates\my_site>python manage.py runserver
Watching for file changes with StatReloader
Performing system checks...
System check identified no issues (0 silenced).
October 25, 2022 - 22:12:41
Django version 4.1.2, using settings 'my_site.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CTRL-BREAK.
Not Found: /
[25/Oct/2022 22:12:43] "GET / HTTP/1.1" 404 2167
Not Found: /favicon.ico
[25/Oct/2022 22:12:44] "GET /favicon.ico HTTP/1.1" 404 2218
[25/Oct/2022 22:12:51] "GET /my_app HTTP/1.1" 301 0
[25/Oct/2022 22:12:51] "GET /my_app/ HTTP/1.1" 200 291
'Python > Django' 카테고리의 다른 글
[Django] Django - filter (0) | 2022.10.27 |
---|---|
[Django] Django - variable 전달 (0) | 2022.10.26 |
[Django] Django - (맛보기)Template (0) | 2022.10.20 |
[Django] Django - (맛보기)reverse (0) | 2022.10.20 |
[Django] Django - (맛보기)Redirect (0) | 2022.10.19 |