サイトアイコン ITC Media

【Django】urls.pyの書き方|path、include

(最終更新月:2022年8月)

✔このような方へ向けて書かれた記事となります

「Django pathの使い方が知りたい!」

「Djangoのurls.pyの役割って何?」

「DjangoのURLで気をつけることってなに?」

✔当記事を通じてお伝えすること

当記事を最後までご覧いただければ、urls.pyの基本的な書き方がわかるのはもちろん、urls.pyやpathがどのような仕組みで機能しているかまでご理解いただけます。

ぜひ最後までご覧ください。

筆者プロフィール

【現職】プロダクトマネージャー

【副業】ブログ(月間20万PV)/YouTube/Web・アプリ制作

「プログラミング × ライティング × 営業」の経験を活かし、30後半からのIT系職へシフト。現在はプロダクトマネージャーとして、さまざまな関係者の間に入り奮闘してます。当サイトでは、実際に手を動かせるWebアプリの開発を通じて、プログラミングはもちろん、IT職に必要な情報を提供していきます。

【当ブログで紹介しているサイト】

当サイトチュートリアルで作成したデモ版日報アプリ

Django × Reactで開発したツール系Webアプリ

✔人に見せても恥ずかしくないコードを書こう

「リーダブルコード」は、わかりやすく良いコードの定義を教えてくれる本です。

  • 見るからにきれいなコードの書き方
  • コードの分割方法
  • 変数や関数の命名規則

エンジニアのスタンダートとすべき基準を一から解説しています。

何回も読むのに値する本なので、ぜひ手にとって読んでみてください。

Django urls.pyとは?

URLとは、ホームページを見る際にブラウザ上部に打ち込む、httpもしくはhttpsから始まる文字列です。

URLを打ち込むことは、該当するページを表示するように要求しているので、HTTPリクエストといいます。

こちらでは、このHTTPリクエストの受け取りにおいて重要なurls.pyについて、以下の2点をお伝えします。

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つを理解しましょう。

順番に見ていきましょう。

ビュー関数やクラスのインポート


ビュー関数やビュークラスをインポートする方法をお伝えします。

以下のどれか1つだけ理解すればインポートは可能ですが、全て目を通しておくと応用がきくようになるので便利です。

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

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, 紐付ける関数(クラス), ページ名)

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を考えます。

運営者情報
ITCブログ運営者のプロフィールページです。経歴や素性など、ざっくばらんにお伝えしています。

ユーザーごとに割り振られたプライマリーキー「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メソッド

当記事の内容をまとめます。

Djangoのpathは、urls.pyを記述するうえで重要なメソッドです。

きちんと使い方を覚えて、余計なエラーを減らしましょう。

モバイルバージョンを終了