Tips

Python入門 Djangoの使い方(その7)ビューとテンプレート
2017.03.13

Python入門 Djangoの使い方(その7)ビューとテンプレート

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の全体ルーティング→個別ルーティング→ビュー→テンプレートの流れをみてきました。
管理を個別ファイルで行えるというメリットがあるものの、最初はファイルの場所が難しく感じるという印象を受けました。

新連載はじまりました!独学で学ぶPython基礎 連載リンク

独学で学ぶ-Pythonプログラミング 連載

Recent News

Recent Tips

Tag Search