DullCodes’s diary

programming,c++,python,MachineLearning,Math,Django,Competitive

初めてのDjango 7 - templates

templatesとは

本来は静的なものであるHTMLファイルに、変数を表示したりHTML内で条件分岐(if文)が
使えたりするテンプレートという機能がある

このテンプレートにはいろいろな言語があるが、Djangoだと
DTL(Django Template Language)というものがデフォルトで使えるようになっている
DTLの機能は後回しにしてまずはtemplatesを読み出すところから

設定

templatesを 使うためにはちょっと設定が必要になる
Djangoで設定すると言えば、そう settings.py

いつものtree

$ tree
.
├── db.sqlite3
├── manage.py
├── myapp
│   ├── __init__.py
│   ├── admin.py
│   ├── apps.py
│   ├── migrations
│   ├── models.py
│   ├── tests.py
│   ├── urls.py
│   └── views.py
└── mysite
    ├── __init__.py
    ├── asgi.py
    ├── settings.py # こいつ
    ├── urls.py
    ├── views.py
    └── wsgi.py

ここの TEMPLATES に path を入力する

settings.py

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        # ここをこう記述するのが鉄板
        'DIRS': [os.path.join(BASE_DIR, 'templates')],
        'APP_DIRS': True,
        ....
    },
]

もとはDIRSは空っぽのリスト そこに os.path.join(...) を設定する
この pathに設定 templatesディレクトリ名
場所はというと BASE_DIR に templates を join しているため

>>> BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
>>> print(BASE_DIR)
/home/hoge/Programming/Python/mysite-project

>>> os.path.join(BASE_DIR, 'templates')
/home/hoge/Programming/Python/mysite-project/templates

になっているはず
つまり mysite-project/templates にtemplatesというディレクトリを作成する
ところから始まる

mysite-project $ mkdir templates
mysite-project $ ls
db.sqlite3  manage.py  myapp  mysite  templates

使い方

とっても簡単 views.py のビュークラスでtemplateを使うようなメソッドを使う

from django.shortcuts import render
from django.views import View


class HelloView(View):
    def get(self, request, *args, **kwargs):
        return render(request, 'index.html')

django.shortcuts.render() ってのがテンプレートを使って HttpResponseオブジェクトを作成
してくれるメソッド こいつに委ねる

template

適当なテンプレートを作成

<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>Index</title>
</head>
<body>
    <h1>HI IM INDEX :D</h1>
</body>
</html>

小まとめ

settings.py の TEMPLATES に path を設定

'DIRS': [os.path.join(BASE_DIR, 'templates')],

views.py の 適当なビュークラスにて renderを用いてテンプレート名を指定

return render(request, 'index.html')

render で指定したテンプレートを作成

HTMLファイルの名前をテンプレート名にする

templates/index.html

実行!

f:id:DullCodes:20200302221124p:plain
very first templates

return render(request, 'index.html')
settings.py の DIRS に指定されたディレクトリ名の配下を再帰的に
見ていき最初にファイル名が一致したやつを表示するらしい

当然renderにはディレクトリ配下にあるファイルも指定できる

# mysite-project/settings.py
templates/myapp/index.html

# myapp/urls.py
return render(request, 'myapp/index.html')

みたいにすることもできる

テンプレ

templatesはアプリケーション毎にディレクトリを作るのはベストプラクティスらしい

|--- myapp1
|--- myapp2
|--- myapp3
|--- templates
       |--- myapp1
       |        |--- index.html
       |
       |--- myapp1
       |        |--- index.html
       |
       |--- myapp1
       |        |--- index.html

こんな感じで作っておくと アプリと templatesがいい感じに分離しているし
管理しやすいのおすすめという話