PythonMania

普段はロボットとAIを組み合わせて色々作ってます。Python関係以外も色々投稿していくと思います。

【Python】Djangoで自前のテンプレートファイルを表示してみる

f:id:mizuhiki0111:20190430175940p:plain



前回の記事の続きです

前回
www.pythonmania.work



今回はオリジナルのhtmlファイルを作成し、表示するところまでやってみます。




環境
Windows10 64bit
Anaconda3
Python3.6.5




①テンプレートフォルダの作成


Djangoでは使用するhtmlファイルを、「templates」フォルダにまとめて格納する必要があります。


templatesフォルダはmanage.pyと同じ階層に設置します。
(myproject/templates)


templatesフォルダが作れたら、templatesフォルダ内に更にアプリと同一名称のフォルダを作成します
(myproject/templates/mysite)


Djangoでは一つのプロジェクト内に複数のアプリケーションを作成することができるため、アプリごとに表示するhtmlファイルを分けるために上記のようにアプリ名のフォルダで分けておく必要があります。





②テンプレートフォルダへのパスを通す

作成したテンプレートフォルダをプロジェクト・アプリから読み込めるようにパスを設定します。


myproject/myproject/settings.pyを開き、以下のように'DIRS:'を変更します。



変更前

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [],
        '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',
            ],
        },
    },
]

変更後

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',
            ],
        },
    },
]


これでtemplatesフォルダを参照することができるようになりました。



③index.htmlを作成


今回トップページに表示するindex.htmlファイルを作成していきます。


ファイルは①で作成したmyproject/templates/mysiteディレクトリに作成します。


今回は表示できるかの確認なので、以下のコードを貼り付けておきます。

<h1>Hello World</h1>

無事に動けば、「Hello World」と表示されます。




④URLの設定

Djangoでは通常、
①プロジェクトのurls.pyの読み込み
②プロジェクトのurls.pyからアプリのurls.pyの読み込み
③アプリのurls.pyからアプリのviews.pyの読み込み
④views.pyのrender関数で指定したhtmlファイルを表示


といった流れでWebページを表示します。


プロジェクトのurls.pyから直接htmlファイルを表示することもできるのですが、

①Djangoではプロジェクト内で複数のアプリを管理することができる
②htmlファイルを動的に処理する(POST/GET等)

などの理由から上記のような流れで処理することが望ましいです。



今回はindex.htmlを表示するだけなので必要のない工程ですが、今後様々なアプリケーションを作成することを想定して上記の処理に慣れておくことが望ましいです。

順番に作成していきます


①プロジェクトのurls.pyの編集


プロジェクトのurls.pyでは、アプリのurls.pyを参照するように変更を加える必要があります。

※アプリのurls.pyはこれから作成するのでまだありません。

myproject/myproject/urls.pyを以下のように書き換えます。

from django.conf.urls import include, url
from django.contrib import admin

urlpatterns = [
    url(r'^myapp', include('myapp.urls')),
    url(r'^admin/', admin.site.urls),
]


これでhttp://127.0.0.1:8000/myappにアクセスした場合にはmyapp.urls記載のURLを参照するように設定することができました。




②アプリのurls.pyの作成


myproject/myapp/urls.pyを作成し、以下のコードを記載します。


from django.conf.urls import url
from . import views

urlpatterns = [
    url(r'^/', views.index_template),
]

プロジェクトレベルのurls.pyでhttp://127.0.0.1:8000/myappにアクセスした場合にこのurls.pyが参照されます。


from . import viewsで同じ階層(アプリ内)のviews.pyを読み込み、http://127.0.0.1:8000/myappにアクセスされた場合にindex_template関数を呼び出す、という処理を記載しています。




また「r'^/'」の部分を変更することで、実際にアクセスするURLを変更することができます。



例えば「r'^/'」を「r'^templates/'」にすることでhttp://127.0.0.1:8000/myapp/templatesにアクセスした場合にviews.pyを呼び出す、といった流れにすることもできます。





③views.pyの編集

アプリのurls.pyでviews.pyのindex_template関数を呼び出す、という処理を記載したので、views.pyにindex_template関数を作成し

実際にindex.htmlファイルを表示する処理を書いていきます。


Djangoではrender関数を使用することで、簡単にindex.htmlの表示(レンダリング)を行うことができます。


コードは以下のようになります
※from django.http.response import HttpResponseをインポートするのを忘れないでください

from django.shortcuts import render
from django.http.response import HttpResponse


def index_template(request):
    return render(request, 'myapp/index.html')


index_template関数で「templates以下の「myapp/index.html」を表示するrequestを行う」処理を記載します。


これでpython manage.py runserverでサーバーを立ち上げhttp://127.0.0.1:8000/myappにアクセスしたときに「Hello World」が表示されれば無事に成功です。