Python入門 Djangoの使い方(その7)ビューとテンプレート
はじめに
不定期連載のPython入門第21回目です。最近はPythonのWebフレームワーク「Django」の使い方にスポットをあてています。DjangoはPythonフレームワークのデファクトスタンダードと言ってもよいほど、シェアの大半を占めているPythonフレームワークです。今回はPython入門として、前回に引き続き、Djangoのテンプレートとビューの使い方を見ていきます。
今回の内容:
- urls.py、views.pyの書き方を理解する。
- テンプレートhtmlをviews.pyのメソッドから呼び出す
前提条件:
- Pythonバージョン:Python3
- Djangoバージョン:Django1.10.5
- 実行環境:Windows8
- ツール:VisualStudioCommunity2015
urls.pyを理解する。
Djangoでは「urls.py」でルーティングを行います。大元になるのはプロジェクトディレクトリ以下にある「urls.py」です。VisualStudioCommunityでDjangoプロジェクトを作成すると、デフォルトで以下のような記述になっています。
""" Definition of urls for DjangoWebProject. """ from datetime import datetime from django.conf.urls import url import django.contrib.auth.views import app.forms import app.views from django.views.generic.base import TemplateView # Uncomment the next lines to enable the admin: # from django.conf.urls import include # from django.contrib import admin # admin.autodiscover() urlpatterns = [ # Examples: url(r'^$', app.views.home, name='home'), url(r'^contact$', app.views.contact, name='contact'), url(r'^about', app.views.about, name='about'), url(r'^login/$', django.contrib.auth.views.login, { 'template_name': 'app/login.html', 'authentication_form': app.forms.BootstrapAuthenticationForm, 'extra_context': { 'title': 'Log in', 'year': datetime.now().year, } }, name='login'), url(r'^logout$', django.contrib.auth.views.logout, { 'next_page': '/', }, name='logout'), # Uncomment the admin/doc line below to enable admin documentation: # url(r'^admin/doc/', include('django.contrib.admindocs.urls')), # Uncomment the next line to enable the admin: # url(r'^admin/', include(admin.site.urls)), ]
「urlpatterns」という配列の各要素にurl関数をもちいてルーティング設定をしています。
Djangoのドキュメントによるとurl関数の書式は以下のようになっています。
url(regex, view, kwargs=None, name=None, prefix=”)
「regex」はURLパターンの正規表現、「kwargs」は引数、「view」はビューテンプレート、「name」は名前を表しています。
この「urls.py」が各アプリケーションの「urls.py」を呼び出します。
今回は以下の記述を追加します。
url(r'^sample1', include('SampleApp1.urls', namespace='sample1')),
「sample1~」というURLパターンでアクセスしたときに、
「SampleApp1」というアプリのurls.pyを呼び出す、という意味になります。
「namespace」は名前空間を表しており、これにより名前の衝突を防ぎます。
なお、このとき、「include」をimportすることを忘れないようにしましょう。
from django.conf.urls import url, include
次に、個別のアプリのurls.pyの記述を見てみます。
from django.conf.urls import url from . import views urlpatterns = [ url(r'^$', views.test1, name='test1'), ]
views.pyで指定されたtest1メソッドを呼び出す、という意味になります。
このようにして親「urls.py」と子「urls.py」を使い分けることで、ルーティングを分かりやすくすることができるのです。
views.pyの関数でテンプレートを呼び出す。
第14回では以下のように、views.pyでHTTPレスポンスを返していました。
def index(request): return HttpResponse("Hello World !")
前回はviews.pyを用いずに、urls.pyから直接テンプレートにアクセスをしていました。しかしこれでは、テンプレートに変数を渡すなどのカスタマイズがしずらくなってしまいます。
そこで、今回はviews.pyのメソッドからテンプレートを呼び出す記述を行います。
def test1(request): return render(request, 'sample1.html')
これで、test1メソッドを呼び出すとsample1.htmlテンプレートが表示されることになります。
sample1.htmlはtemplatesディレクトリ下に作成しておきましょう。
settings.pyの編集
前回同様に以下のようにしておく必要があります。
~省略~ INSTALLED_APPS = [ 'SampleApp1', //←追加 'app', ~省略~
上記のように作成したアプリケーションの名前に応じてINSTALLED_APPSに追記します。
まとめ
Djangoの全体ルーティング→個別ルーティング→ビュー→テンプレートの流れをみてきました。
管理を個別ファイルで行えるというメリットがあるものの、最初はファイルの場所が難しく感じるという印象を受けました。