基本

Django URLルーティング入門|urls.pyの書き方

Django ルーティング urls.py

Django URLルーティング入門
urls.pyの書き方

Djangoのurls.pyを使ったルーティング設定、別ファイルの読み込み、URLパラメータの渡し方を解説します。

こんな人向けの記事です

  • DjangoのURL設定方法を学びたい人
  • アプリケーションごとにurls.pyを分割したい人
  • URLパラメータをビューに渡す方法を知りたい人

Step 1urls.pyの役割

urls.pyは、リクエストされたURLに対してどのビュー(views.py内のクラスや関数)で処理するかを決めるルーティング設定ファイルです。Webアプリケーションの「道案内」のような役割を担っています。

Step 2デフォルトのurls.py

プロジェクト作成時に生成されるurls.pyの初期内容は以下の通りです。

myproject/urls.py
from django.contrib import admin
from django.urls import path

urlpatterns = [
    path("admin/", admin.site.urls),
]

/admin/にアクセスするとDjango管理画面が表示されます。これがDjangoに最初から設定されている唯一のルーティングです。

Step 3ルーティングの追加

新たなルーティングはpath()関数を使って追加します。

myproject/urls.py
from django.contrib import admin
from django.urls import path
from myapp import views

urlpatterns = [
    path("admin/", admin.site.urls),
    path("hello/", views.HelloView.as_view(), name="hello"),
    path("about/", views.AboutView.as_view(), name="about"),
]

path()の引数は以下の通りです。

引数説明
第1引数URLパターン"hello/"
第2引数対応するビューviews.HelloView.as_view()
nameURLの名前(テンプレートで使用)"hello"

Step 4別ファイルのurls.pyを読み込む

アプリケーションごとにurls.pyを分割する場合はinclude()を使用します。大規模プロジェクトでは必須のテクニックです。

myproject/urls.py
from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path("admin/", admin.site.urls),
    path("myapp/", include("myapp.urls")),
    path("blog/", include("blog.urls")),
]
myapp/urls.py
from django.urls import path
from . import views

app_name = "myapp"

urlpatterns = [
    path("", views.IndexView.as_view(), name="index"),
    path("detail/", views.DetailView.as_view(), name="detail"),
]

この設定で、以下のURLが有効になります。

有効なURL
/myapp/          → myapp.views.IndexView
/myapp/detail/   → myapp.views.DetailView

ポイント: app_nameを設定すると、テンプレートでURLを逆引きする際に名前空間として使用できます(例: myapp:index)。アプリケーション間でURL名が衝突するのを防ぎます。

Step 5URLパラメータの渡し方

URLを通じてビューに値を渡すことができます。<型:変数名>の形式で定義します。

urls.py
urlpatterns = [
    path("company/<int:pk>/", views.CompanyDetailView.as_view(), name="company_detail"),
    path("user/<str:username>/", views.UserProfileView.as_view(), name="user_profile"),
]
views.py
class CompanyDetailView(View):
    def get(self, request, pk):
        # pk にURLのパラメータが渡される
        company = Company.objects.get(id=pk)
        return render(request, "detail.html", {"company": company})

/company/1/にアクセスすると、ビューにpk=1が渡されます。

注意: URLパターンの順序に注意してください。Djangoはurlpatternsリストの上から順にマッチするか確認し、最初にマッチしたパターンを使用します。具体的なパターンを先に配置してください。

Step 6URLパターンの型一覧

パターン説明
<int:pk>整数1, 2, 100
<str:name>文字列(/以外)hello, world
<slug:slug>スラッグ(英数字, -, _)my-page, page_1
<uuid:id>UUID075194d3-6885-...
<path:filepath>パス(/を含む)docs/2024/03

Step 7テンプレートからURLを生成する

テンプレート内でURLをハードコードするのではなく、{% url %}タグを使ってURLを生成します。

テンプレート
<!-- 基本的な使い方 -->
<a href="{% url 'myapp:index' %}">トップページ</a>

<!-- パラメータ付き -->
<a href="{% url 'myapp:company_detail' pk=company.id %}">
  {{ company.name }}の詳細
</a>

ポイント: {% url %}タグを使うことで、urls.pyのURLパターンを変更しても、テンプレート内のリンクが自動的に更新されます。URLのハードコードは保守性が低下するため避けてください。

まとめ

  • urls.pyはURLとビューの対応を定義するルーティングファイル
  • path()関数でURLパターン、ビュー、URL名を設定する
  • include()でアプリケーションごとにurls.pyを分割できる
  • <int:pk>などのパターンでURLパラメータをビューに渡せる
  • テンプレートでは{% url %}タグを使ってURLを生成する