(最終更新月:2022年8月)
✔このような方へ向けて書かれた記事となります
「Django pathの使い方が知りたい!」
「Djangoのurls.pyの役割って何?」
「DjangoのURLで気をつけることってなに?」
✔当記事を通じてお伝えすること
- urls.pyとは?
- urls.pyの書き方
- urls.pyで使う変数やメソッド
当記事を最後までご覧いただければ、urls.pyの基本的な書き方がわかるのはもちろん、urls.pyやpathがどのような仕組みで機能しているかまでご理解いただけます。
ぜひ最後までご覧ください。
Django urls.pyとは?
URLとは、ホームページを見る際にブラウザ上部に打ち込む、httpもしくはhttpsから始まる文字列です。
URLを打ち込むことは、該当するページを表示するように要求しているので、HTTPリクエストといいます。
こちらでは、このHTTPリクエストの受け取りにおいて重要なurls.pyについて、以下の2点をお伝えします。
- urls.pyの役割
- urls.pyの場所
urls.pyの役割
Djangoのurls.pyは、ユーザーからのHTTPリクエストを受け取り、どのページを表示するかを判断します。
これをルーティングといいます。
具体的には、以下のようなことをおこなっています。
urls.pyがURLとView関数やViewクラスを紐付ける役割を担っています。
urls.pyの場所
urls.pyの場所は主に2つあります。
- プロジェクトフォルダ
- アプリフォルダ
HTTPリクエストを受け取ったら、最初にプロジェクトフォルダのurls.pyを見にいきます。
そこの指示に従い、必要があればアプリフォルダのurls.pyにいくという流れです。
.
├── db.sqlite3
├── main #プロジェクトフォルダ
│ ├── __init__.py
│ ├── asgi.py
│ ├── settings.py
│ ├── urls.py #最初に見にいくurls.py
│ └── wsgi.py
├── manage.py
└── myapp #アプリフォルダ
├── __init__.py
#.途中割愛
#.
#.
├── urls.py #プロジェクトフォルダのurls.pyからの指示により見にくる
└── views.py
プロジェクトフォルダ内のurls.pyは、プロジェクトの立ち上げ時に自動で生成されます。
アプリフォルダ内のurls.pyは、必要に応じて追加する必要があります。
具体的な書き方を見ていきましょう。
Django urls.pyの書き方
urls.pyを書くために、以下の3つを理解しましょう。
- ビューをインポートする
- 変数「urlpatterns」にパスを定義する
- Djangoでのパスの書き方
順番に見ていきましょう。
ビュー関数やクラスのインポート
ビュー関数やビュークラスをインポートする方法をお伝えします。
以下のどれか1つだけ理解すればインポートは可能ですが、全て目を通しておくと応用がきくようになるので便利です。
- views.pyそのものをインポートする
- 一列で関数(もしくはクラス)をインポートする
- ビュー関数(もしくはクラス)を綺麗に並べる
- ほかのアプリケーションからインポートする
views.pyをインポートする
以下のコマンドで「views.py」そのものをインポートできます。
from . import views
「.」は記述しているファイルの属するフォルダ(カレントディレクトリ)の意味となります。
ビュー関数やビュークラスは「views.py」に保存されているので、ビュー関数「index」を使用するときは以下のようになります。
from . import views
#ビュー関数は以下のように記述します。
views.index
一列で複数の関数(もしくはクラス)をインポートする
以下のコマンドでビュー関数やビュークラスをインポートできます。
from .views import ビュー関数(ビュークラス), ビュー関数(ビュークラス)
ビュー関数使用するときは以下のとおり。
from .views import index, profile, contact
#ビュー関数は以下のように記述します。
index
profile
contact
ビュー関数(もしくはクラス)を綺麗に並べる
複数の関数やクラスを綺麗に並べたいときは「( )」を使います。
from .views import (
ビュー関数(ビュークラス),
ビュー関数(ビュークラス),
)
ひとつずつ縦に並べることで数が多いときも見やすくなります。
from .views import (
index,
profile,
contact,
DetailView, #こちらはViewクラスです
)
ほかのアプリケーションからインポートする
ほかのアプリからビュー関数やビュークラスをインポートしたいときは以下のように記述します。
from アプリ.views import ビュー関数(クラス)
例えば、accountsアプリからビュー関数「my_login」をインポートするときは、以下のようになります。
from accounts.views import my_login
urls.pyでよく使う変数やメソッド「path」
紐付けたいビュー関数やビュークラスのインポートが完了したら、urls.py内で変数「urlpatterns」を定義していきましょう。
以下のとおりひとつずつ詳しく見ていきます。
- urlpatterns
- pathメソッド
- includeメソッド
urlpatterns
urlpatternsは、パスを要素として持つリスト型の変数です。
ルーティングの役割を担っています。
基本的な書き方としては以下のとおりです。
urlpatterns = [
path(相対URL, 紐付ける関数(クラス), ページ名)
]
要素であるpathは、ほかのメソッド「re_path」などに置き換えることもできます。
まずはよく使われるpathを詳しく見ていきましょう。
相対URLとは、ドメイン以下のパスのこと。
例えば、当ページであれば、「/django/django-path/」が相対URLです。
対して、絶対URLとはドメインも含む全てのURLパスのことになります。
当ページであれば、「https://itc.tokyo/django/django-path/」が絶対URLです。
path
pathは、Djangoのルーティングを担う大切なメソッドです。
主には2つの書き方があります。
- path(相対URL, 紐付ける関数(クラス), ページ名)
- path(相対URL, include(紐付けたいurls.py))
具体例は以下のとおりです。
path(相対URL, 紐付ける関数(クラス), ページ名)
from .views import (
mylistview, #ビュー関数
MyDetailView, #ビュークラス
)
urlpatterns = [
path("list/", mylistview, name="my-list") #ビュー関数の書き方
path("detail/", MyDetailView.as_view(), name="my-detail") #ビュークラスの書き方
]
ビュークラスの場合は、ビュークラス名.as_view()となることを覚えておきましょう。
path(相対URL, include(紐付けたいurls.py))については次章でご説明します。
include
「include」メソッドは、ビュー関数ではなく、別のurls.pyと紐付けたいときに使えるメソッドです。
実際にはプロジェクトフォルダ内のurls.pyで使われることが多く、アプリ内のurls.pyと紐付けるために使われます。
まずはincludeをインポートします。
from django.url import path, include
こちらの例では「myapp」内のurls.pyと紐付けます。
#プロジェクトフォルダ内のurls.py
urlpatterns = [
path("myapp/", include("myapp.urls"),
]
includeメソッドの引数は、文字列で記載します。
#アプリフォルダ内のurls.py
from .views import myapp-list
urlpatterns = [
path("list/", myapp-list, name="myapp-list"),
]
この場合は、「myapp-list」ページの相対URLは、以下のようになります。
/myapp/list/
(応用編)相対URLの書き方
urls.pyの役割は、URLとビュー関数を紐付けること。
こちらでは相対URLの応用した書き方として、URLの中に数値やスラッグを含む方法と、re_pathメソッドについて解説します。
数値により表示するページを変える「int:pk」
ページのテンプレートは変わらないが、中身のデータを変えて表示したい場合があります。
たとえば以下のようなURLを考えます。
ユーザーごとに割り振られたプライマリーキー「PK」により、どのユーザーのプロフィールを載せるか判別します。
保存されているデータの数だけURLが存在することになるので、いちいち相対パスに数値を打ち込むのは大変です。
以下のように記述することでURLに数値を含められます。
<データ型: 変数名>
具体的には以下のように記述します。
urlpatterns = [
path("profile/<int:pk>/", profile_view, name="profile"),
]
これはデータの詳細を表示するページ「DetailView」やデータの編集するページ「UpdateView」で使われます。
以下の記事にて詳しく説明しています。
スラッグにより表示するページを変える「slug:slug」
int型を受け取るだけでなく、文字列を受け取る方法もあります。
具体的にはブログ記事のURLに使われることが多いです。
書き方は以下のとおり。
urlpatterns = [
path("profile/<slug:slug>/", profile_view, name="profile"),
]
関連性のあるモデルフィールドとしてSlugFieldがあります。
以下の記事にて詳しく説明しています。
正規表現で指定する「re_pathメソッド」
相対パスを記述する方法として、正規表現を使う方法があります。
正規表現を使うと以下のような記述になります。
from django.urls import re_path
from .views import email_confirmation
urlpatterns = [
re_path(r"^email-confirmation/?P<key>[-:\w]+)/$", email_confirmation, name="email-confirmation"),
]
このやり方は、JavaScript系のフレームワークをフロントエンドで使う際などに使われます。
正規表現に限らず、Pythonについて詳しく勉強したい方はUdemyのレッスンもおすすめです。
まとめ:urls.pyの基本はpathメソッド
当記事の内容をまとめます。
- urls.pyは、URLとViewの紐付けが主な役割
- urls.pyの書き方は、pathメソッドに正しい値を渡すこと
- path以外にも、includeやre_pathを覚えておくと便利
Djangoのpathは、urls.pyを記述するうえで重要なメソッドです。
きちんと使い方を覚えて、余計なエラーを減らしましょう。