概要
リクエストされたURLから、Django内部で必要なview関数を呼ぶためのルーティングは、urls.py
で設定する。
urls.py
はプロジェクト設定ディレクトリーの下か、各アプリケーションディレクトリーの下- アプリケーションディレクトリー下の
urls.py
は新規に作成し、設定ディレクトリーのurls.py
でinclude
する - ルーティングは
urls.py
のurlpatterns
配列にpath
関数で登録する path
関数の引数に、URLパターンとビュー関数を与える
設定ディレクトリー下のurls.py
プロジェクト構成
djangobasics
プロジェクトを作成。設定ディレクトリーをconf
とし、アプリケーションurlinclude
を作成・登録した場合のツリーは以下の通り。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
/djangobasics/ ├── conf │ ├── __init__.py │ ├── asgi.py │ ├── settings.py │ ├── urls.py │ └── wsgi.py ├── manage.py └── urlinclude ├── __init__.py ├── admin.py ├── apps.py ├── migrations │ └── __init__.py ├── models.py ├── tests.py ├── urls.py └── views.py |
ビューとテンプレート
urlinclude/views.py
を以下のように編集する。
1 2 3 4 |
from django.shortcuts import render def index(request): return render(request, 'urlinclude/index.html') |
urlinclude/templates/urlinclude
ディレクトリーを作成し、その下にindex.html
を以下の内容で作成。
1 2 3 4 5 6 7 8 9 10 |
<!DOCTYPE html> <html lang="ja"> <head> <meta charset="utf-8"> <title>Index</title> </head> <body> <h1>Index</h1> </body> </html> |
pathの登録
設定ディレクトリーconf
の下のurls.py
に以下のように追記。以下、このurls.py
を「グローバルなurls.py
」と呼ぶ。
1 2 3 4 5 6 7 8 |
from django.contrib import admin from django.urls import path from urlinclude import views urlpatterns = [ path('admin/', admin.site.urls), path('urlinclude', views.index), ] |
まずアプリケーションのviewsモジュールをインポートしている。
1 |
from アプリケーション名 import views |
そしてホスト名/アプリケーション名
でindexビュー関数が呼ばれるようルーティング。
1 |
path('アプリケーション名', views.ビュー関数) |
ここでhttp://localhost:8000/urlinclude
でブラウザーからアクセスすると、index.html
の内容が表示される。
アプリケーション下のurls.py
グローバルなurls.pyの問題点
設定ファイル直下のurls.py
でのpath
登録は、
- デフォルトで作成された
urls.py
を編集すればよい - 任意のアプリケーションのルーティング登録ができる
ただし以下のような問題点がある。
- 登録するビューのアプリケーションをインポートする必要がある
- 全てのビューを登録するため見通しが悪くなる
- アプリケーション間でビューの名前の衝突が起こり得る
このため一般にはアプリケーションごとにurls.py
を作成し、そのモジュールを設定ディレクトリー下のグローバルなurls.py
でinclude
する。
ビューとテンプレート
ビューとテンプレートは先の例と同じものを使う。
アプリケーションのurls.pyの準備
アプリケーションディレクトリー下に、以下の内容でurls.py
ファイルを作成する。conf/urls.py
のように自動作成されないので、新たに作成する必要がある。
1 2 3 4 5 6 |
from django.urls import path from urlinclude import views urlpatterns = [ path('index', views.index), ] |
ツリーは以下の通り。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
/djangobasics/ ├── conf │ ├── __init__.py │ ├── asgi.py │ ├── settings.py │ ├── urls.py │ └── wsgi.py ├── manage.py ├── startserver.sh └── urlinclude ├── __init__.py ├── admin.py ├── apps.py ├── migrations │ ├── __init__.py │ └── __pycache__ │ └── __init__.cpython-36.pyc ├── models.py ├── templates │ └── urlinclude │ └── index.html ├── tests.py ├── urls.py └── views.py |
グローバルなurls.pyの編集
conf/urls.py
を以下のように編集する。
django.urls
パッケージのpath
モジュールに加えて、include
モジュールもインポートするurlpatterns
配列にpath
関数を追加し、アプリケーションのurls.py
をinclude
する
1 2 3 4 5 6 7 8 9 |
from django.contrib import admin from django.urls import path, include #from urlinclude import views urlpatterns = [ path('admin/', admin.site.urls), # path('urlinclude/', views.index), path('urlinclude/', include('urlinclude.urls')), ] |
ここでhttp://localhost:8000/urlinclude/index
にアクセスすると、index.html
がブラウザーに表示される。
アプリケーションの登録
新たにアプリケーションを作成した場合には、プロジェクト共通ディレクトリーのsettings.py
でINSTALLED_APPS
に作成したアプリケーションを登録しておく必要がある。
1 2 3 4 |
INSTALLED_APPS = [ ...., 'urlinclude.apps.UrlincludeConfig', ] |
留意点
グローバルなurls.py
では、個々のアプリケーションのviewsモジュールをインポートする必要はない。
include
関数の第1引数はアプリケーション名を使ったディレクトリーで、その後にアプリケーション内で定義したパスが続く。
- 今回の例では
'urlinclude/'
+'index'
→'urlinclude/index'
- 末尾に
'/'
がないとエラーになる
include
関数の引数は、'アプリケーション.urls'
の文字列。
- 文字列にしていないと”名前が見つからない”、とエラーになる
直接テンプレートを表示する
path
関数で直接テンプレートを表示させることもできるが、少し手間が必要。
urls.py
でTemplateVierw
クラスをインポートpath
関数の第2引数にTemplateView.as_view()
メソッドを与えてテンプレートを指定
たとえば以下は、index.html
と同じディレクトリーにexample.html
を作成し、これを直接path
関数から呼び出す例。
1 2 3 4 5 6 7 8 |
from django.urls import path from urlinclude import views from django.views.generic.base import TemplateView urlpatterns = [ path('index', views.index), path('example', TemplateView.as_view(template_name='urlinclude/example.html')), ] |