template_name = 'index.html'

return render(request, template_name)

djangoにおいて上記の様に単にindex.htmlを指定するだけでは非常に危険です。

djangoは自動的にルートディレクトリおよびアプリケーションディレクトリ直下とtemplatesフォルダ内のテンプレート名を取得します。

もし仮に異なるアプリ間で同名のindex.htmlが存在すると、意図しないindex.htmlが読み込まれる可能性があります。

従ってテンプレート名を指定する場合はアプリケーション名込みで指定する必要があります。

 

まずテンプレートディレクトリの配置構造を以下の様にしましょう。

プロジェクト名/
    manage.py
    アプリケーション名/
        template/
            アプリケーション名/
                index.htm

少し冗長的ですが、静的ファイルのディレクトリ構造と同様にテンプレートも上記のような構造にする必要があります。

ビューからの呼び出しは以下の様に指定します。

template_name = 'calculator/index.html'

return render(request, template_name)