본문 바로가기

Python/Django

[Django] Django - (맛보기 migrate)App별 template 디렉토리

이번에는 앱별로 템플릿 디렉토리를 만들어서 관리하는 방법에 대해서 알아보겠습니다.

settings.py 파일의 INSTALLED_APPS 변수에 그 커스텀 Django 앱을 등록해야 합니다.

 

 

1단계

  1. 새로운 Django 앱 생성 - manage.py startapp "앱이름"
  2. 앱 내에서 urls.py을 열고, views.py를 생성합니다.
  3. 뷰를 특정 URL에 연결하고, 실제 앱 URL을 프로젝트 URL에 매핑

 

2단계 - 데이터베이 테이블과 모델에 대한 작업

  1. migrate 명령인 'python manage.py migrate'를 실행 - settings.py 내부의 설치된 앱(INSTALLED_APPS)을 살펴보고, 필요한 데이터베이스 테이블을 생성합니다.
 

3단계 - 프로젝트가 앱폴더를 인식하게 연결(앱 내부의 템플릿 폴더를 인식하게 설정)

  1. Django 앱 내부에 자동생성된 apps.py 파일을 확인 후, 프로젝트용 settings.py 내부의 INSTALLED_APPSAppConfig 클래스를 등록, 즉, 2단계에서 데이터베이스 테이블과 모델에 대한 작업을 수행하고, 3단계에서는 프로젝트가 앱 디렉토리를 인식할 수 있도록 연결을 수행하여, 앱 내부의 템플릿 디렉토리를 인식 시키기.
  2. apps.py를 열면 AppConfig와 유사한 것을 볼 수 있는데, 이부분의 코드 한 줄을 가져 와서, INSTALLED_APPS 리스트에 붙여넣는 겁니다.

 

4단계 - Django에 앱과 모든 데이터베이스 변경 사항을 등록

  1. python manage.py makemigrations my_app 명령으로 Django에 앱과 모든 데이터베이스 변경 사항을 등록.
  2. 실제로 모델을 생성할 때까지는 그다지 관련성이 없지만, 일반적인 업무절차상이니 진행한다.

 

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