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の初期内容は以下の通りです。
from django.contrib import admin
from django.urls import path
urlpatterns = [
path("admin/", admin.site.urls),
]
/admin/にアクセスするとDjango管理画面が表示されます。これがDjangoに最初から設定されている唯一のルーティングです。
Step 3ルーティングの追加
新たなルーティングはpath()関数を使って追加します。
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() |
| name | URLの名前(テンプレートで使用) | "hello" |
Step 4別ファイルのurls.pyを読み込む
アプリケーションごとにurls.pyを分割する場合はinclude()を使用します。大規模プロジェクトでは必須のテクニックです。
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")),
]
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が有効になります。
/myapp/ → myapp.views.IndexView
/myapp/detail/ → myapp.views.DetailView
ポイント: app_nameを設定すると、テンプレートでURLを逆引きする際に名前空間として使用できます(例: myapp:index)。アプリケーション間でURL名が衝突するのを防ぎます。
Step 5URLパラメータの渡し方
URLを通じてビューに値を渡すことができます。<型:変数名>の形式で定義します。
urlpatterns = [
path("company/<int:pk>/", views.CompanyDetailView.as_view(), name="company_detail"),
path("user/<str:username>/", views.UserProfileView.as_view(), name="user_profile"),
]
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> | UUID | 075194d3-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を生成する