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プロジェクトを作成すると、デフォルトで以下のような記述になっています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 | """ 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」を呼び出します。
今回は以下の記述を追加します。
1 | url(r '^sample1' , include( 'SampleApp1.urls' , namespace = 'sample1' )), |
「sample1~」というURLパターンでアクセスしたときに、
「SampleApp1」というアプリのurls.pyを呼び出す、という意味になります。
「namespace」は名前空間を表しており、これにより名前の衝突を防ぎます。
なお、このとき、「include」をimportすることを忘れないようにしましょう。
1 | from django.conf.urls import url, include |
次に、個別のアプリのurls.pyの記述を見てみます。
1 2 3 4 5 6 | 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レスポンスを返していました。
1 2 | def index(request): return HttpResponse( "Hello World !" ) |
前回はviews.pyを用いずに、urls.pyから直接テンプレートにアクセスをしていました。しかしこれでは、テンプレートに変数を渡すなどのカスタマイズがしずらくなってしまいます。
そこで、今回はviews.pyのメソッドからテンプレートを呼び出す記述を行います。
1 2 | def test1(request): return render(request, 'sample1.html' ) |
これで、test1メソッドを呼び出すとsample1.htmlテンプレートが表示されることになります。
sample1.htmlはtemplatesディレクトリ下に作成しておきましょう。
settings.pyの編集
前回同様に以下のようにしておく必要があります。
1 2 3 4 5 | ~省略~ INSTALLED_APPS = [ 'SampleApp1' , / / ←追加 'app' , ~省略~ |
上記のように作成したアプリケーションの名前に応じてINSTALLED_APPSに追記します。
まとめ
Djangoの全体ルーティング→個別ルーティング→ビュー→テンプレートの流れをみてきました。
管理を個別ファイルで行えるというメリットがあるものの、最初はファイルの場所が難しく感じるという印象を受けました。