Djangoのテンプレートを利用してみます。
あらかじめhello_projcectというプロジェクトを作成し、myapp1およびmyapp2という2つのアプリケーションを作成しておきます。
1 2 3 4 5 6 |
├── hello_project ├── db.sqlite3 ├── hello_project ├── manage.py ├── myapp1 └── myapp2 |
hello_project/urls.py は下記のように記述しておきます。
1 2 3 4 5 6 7 8 |
from django.contrib import admin from django.urls import path, include urlpatterns = [ path('admin/', admin.site.urls), path('myapp1/', include('myapp1.urls')), path('myapp2/', include('myapp2.urls')), ] |
関連ページ
テンプレートは主にプロジェクト単位とアプリケーション単位において分けることができます。本記事では、アプリケーションと同じ構成であるプロジェクト単位でのテンプレートが存在した場合、プロジェクトの方が優先されることを確認します。
アプリケーション単位でのテンプレート
はじめにアプリケーション単位でのテンプレートを作成していきます。
settings.pyのINSTALLED_APPSの項目に、myapp1およびmyapp2を追記します。
hello_project/settings.py
1 2 3 4 5 6 7 8 9 10 |
INSTALLED_APPS = [ 'myapp1', 'myapp2', 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', ] |
まずmyapp1ディレクトリ内にtemplatesディレクトリを作成し、更にmyapp1ディレクトリを作成します。そして、その中にindex.htmlを作成します。
同様に、myapp2ディレクトリ内にtemplatesディレクトリを作成し、更にmyapp2ディレクトリを作成、その中にindex.htmlを作成します。
下記のようなディレクトリ構造になっていることを確認して下さい。※説明していないファイル等の表示は省いています。
1 2 3 4 5 6 7 8 9 |
├── hello_project ├── myapp1 │ ├── templates │ └── myapp1 │ └── index.html └── myapp2 ├── templates └── myapp2 └── index.html |
各アプリケーション(myapp1/myapp2)のtemplatesの下に、更にアプリケーションと同名のディレクトリを作成することによって、名前空間としての機能をもたせています(後述)。
作成したindex.htmlは下記のように記述します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title>テンプレート</title> </head> <body> <h1>テンプレートサンプル</h1> <p>{{ message }}</p> </body> </html> |
次にmyapp1およびmyapp2ディレクトリ内にそれぞれurls.pyを作成し、下記のように編集します。
myapp1/urls.py および myapp2/urls.py
1 2 3 4 5 6 |
from django.urls import path from . import views urlpatterns = [ path('', views.index, name='index'), ] |
最後に各アプリケーションディレクトリ内のviews.pyをそれぞれ下記のように編集します。
myapp1/views.py
1 2 3 4 5 6 |
from django.shortcuts import render def index(request): param = {"message": "myapp1です"} return render(request, 'myapp1/index.html', param) |
myapp2/views.py
1 2 3 4 5 6 |
from django.shortcuts import render def index(request): param = {"message": "myapp2です"} return render(request, 'myapp2/index.html', param) |
「myapp1/index.html」「myapp2/index.html」のようにディレクトリ名から記述することによって名前空間としての機能を持つようになり、各アプリケーションで用意したテンプレートを区別しています。
以上で下記URLにて二つのアプリケーション画面が表示されます。
1 2 |
http://127.0.0.1:8000/myapp1/ http://127.0.0.1:8000/myapp2/ |
http://127.0.0.1:8000/myapp1/ での画面
プロジェクト単位でのテンプレート
次にプロジェクト単位でのテンプレートを作成します。
はじめの方で説明したように、アプリケーションと同じ構成であるプロジェクト単位でのテンプレートが存在した場合、プロジェクトの方が優先されることを確認します。
まずルートディレクトリつまりmanage.pyと同階層に、templatesディレクトリを作成して下さい。そして更にmyapp1ディレクトリ、その中にindex.htmlを作成していきます。
1 2 3 4 5 6 7 8 9 |
├── hello_project ├── db.sqlite3 ├── hello_project ├── manage.py ├── myapp1 ├── myapp2 └── templates └── myapp1 └── index.html |
myapp1アプリケーションのtemplates以下と同じ構成にしています。
index.htmlは下記のように編集します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title>テンプレート</title> </head> <body> <h1>プロジェクトのテンプレートサンプル</h1> <p>{{ message }}</p> </body> </html> |
次にsettings.pyのTEMPLATES>DIRSを下記のように記述します。
hello_project/settings.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': [os.path.join(BASE_DIR, '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', ], }, }, ] |
以上で、http://127.0.0.1:8000/myapp1/にアクセスすると、アプリケーション側のテンプレートではなく、プロジェクト側のテンプレート、すなわちhello_project/templates/myapp1/index.html のテンプレートが利用されていることが確認できます。下記画像が表示された様子です。
通常は、管理のしやすいアプリケーション単位でのテンプレートを利用することが多いようです。
関連ページ
参照ページ
django ドキュメント