| この記事の要点 |
|
Django ルーティングの全体像
Django のルーティングは URLconf と呼ばれ、ファイル urls.py に書かれた urlpatterns リストで URL → View の対応を表現します。プロジェクトには最低 2 つの urls.py があるのが一般的:
myproject/
├── manage.py
├── myproject/
│ ├── settings.py
│ ├── urls.py ← プロジェクトのルート URLconf
│ └── wsgi.py
└── users/
├── views.py
├── urls.py ← users アプリの URLconf
└── models.py
基本: path() の使い方
# users/urls.py
from django.urls import path
from . import views
urlpatterns = [
path('', views.user_list, name='user-list'),
path('users/', views.user_list, name='users'),
path('users/<int:id>/', views.user_detail, name='user-detail'),
path('users/create/', views.user_create, name='user-create'),
path('users/<int:id>/edit/', views.user_edit, name='user-edit'),
path('users/<int:id>/delete/', views.user_delete, name='user-delete'),
]
URL パラメータ(コンバータ)
| コンバータ | 正規表現 | 変換結果 | 例 |
|---|---|---|---|
| str | [^/]+ | str(デフォルト) | username |
| int | [0-9]+ | int | 123 |
| slug | [-a-zA-Z0-9_]+ | str | hello-world |
| uuid | UUID 形式 | UUID | 550e8400-e29b... |
| path | .+ (スラッシュ含む) | str | files/sub/dir.jpg |
urlpatterns = [
# 整数 ID
path('articles/<int:year>/', views.year_archive),
# → /articles/2026/
# 複数パラメータ
path('articles/<int:year>/<int:month>/', views.month_archive),
# → /articles/2026/05/
# slug
path('blog/<slug:slug>/', views.blog_detail),
# → /blog/my-first-post/
# UUID
path('items/<uuid:token>/', views.item_by_token),
# → /items/550e8400-e29b-41d4-a716-446655440000/
# path(スラッシュを含む)
path('files/<path:filepath>/', views.file_browser),
# → /files/2026/05/photos/cat.jpg/
]
View 側でのパラメータ受け取り
# users/views.py
from django.shortcuts import render, get_object_or_404
from .models import User
def user_detail(request, id):
# URL の <int:id> がそのまま引数に
user = get_object_or_404(User, pk=id)
return render(request, 'users/detail.html', {'user': user})
def year_archive(request, year):
articles = Article.objects.filter(year=year)
return render(request, 'articles/year.html', {'articles': articles, 'year': year})
def file_browser(request, filepath):
# path コンバータでスラッシュ含むパスを受け取る
return render(request, 'files/browse.html', {'path': filepath})
include() でアプリ別の urls.py を統合
# myproject/urls.py (プロジェクトのルート)
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
# users アプリの URLconf を /users/ 配下にマウント
path('users/', include('users.urls')),
# blog アプリの URLconf を /blog/ 配下にマウント
path('blog/', include('blog.urls')),
# ルート / は home アプリへ
path('', include('home.urls')),
]
users/urls.py で path("", ...) としていれば、結果として /users/ になります。
名前付き URL と namespace
# users/urls.py
app_name = 'users' # 名前空間
urlpatterns = [
path('', views.user_list, name='list'),
path('<int:id>/', views.user_detail, name='detail'),
]
# 参照側
# templates/users/list.html
# <a href="{% url 'users:detail' id=user.id %}">詳細</a>
# views.py
from django.urls import reverse
url = reverse('users:detail', kwargs={'id': 42})
# → "/users/42/"
from django.shortcuts import redirect
return redirect('users:list')
re_path: 正規表現ルート
より複雑なパターンが必要な場合は re_path を使います:
from django.urls import re_path
urlpatterns = [
# 年月(前ゼロ必須)
re_path(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$',
views.month_archive),
# 大文字英字のみのスラッグ
re_path(r'^code/(?P<code>[A-Z]+)/$', views.code_view),
# /old/path/ を /new-path/ にリダイレクト
re_path(r'^old/(?P<path>.+)/$', views.legacy_redirect),
]
クエリパラメータ(?key=value)
?page=2&sort=name のようなクエリ文字列は URLconf には書かず、View で取得:
# views.py
def user_list(request):
# URL: /users/?page=2&sort=name
page = request.GET.get('page', 1)
sort = request.GET.get('sort', 'id')
users = User.objects.order_by(sort)
return render(request, 'users/list.html', {
'users': users[(int(page)-1)*20: int(page)*20],
'page': page,
})
APPEND_SLASH 設定
Django はデフォルトで URL の末尾スラッシュがない場合、付けてリダイレクトします:
# settings.py(デフォルト)
APPEND_SLASH = True
# /users → /users/ に 301 リダイレクト
APPEND_SLASH = False
# /users → 404
カスタム 404 / 500 ハンドラ
# myproject/urls.py
handler404 = 'myproject.views.custom_404'
handler500 = 'myproject.views.custom_500'
# myproject/views.py
from django.shortcuts import render
def custom_404(request, exception):
return render(request, '404.html', status=404)
def custom_500(request):
return render(request, '500.html', status=500)
# 注意: DEBUG = False のときのみ有効
URL のテスト
# tests.py
from django.test import TestCase
from django.urls import reverse
class UserURLTest(TestCase):
def test_user_detail_url(self):
url = reverse('users:detail', kwargs={'id': 42})
self.assertEqual(url, '/users/42/')
def test_user_detail_view(self):
response = self.client.get('/users/42/')
self.assertEqual(response.status_code, 200)
self.assertTemplateUsed(response, 'users/detail.html')
def test_404(self):
response = self.client.get('/users/99999/')
self.assertEqual(response.status_code, 404)
カスタムコンバータ
# converters.py
class FourDigitYearConverter:
regex = '[0-9]{4}'
def to_python(self, value):
return int(value)
def to_url(self, value):
return '%04d' % value
# urls.py
from django.urls import path, register_converter
from . import converters, views
register_converter(converters.FourDigitYearConverter, 'yyyy')
urlpatterns = [
path('articles/<yyyy:year>/', views.year_archive),
]
FAQ
Q: NoReverseMatch エラー
A: {% url %} や reverse に渡す名前が urls.py の name= と一致しているか、kwargs が足りているか確認。
Q: URL の末尾スラッシュが厄介
A: Django は / 終わりが慣習。フロントエンド (React/Vue) と齟齬が出る場合は APPEND_SLASH = False + 明示記述で揃える。
Q: re_path と path はどちらを使うべき
A: 通常は path(読みやすい)。正規表現が必要な複雑なケースだけ re_path。
子ページ
子ページはありません
同階層のページ
人気ページ
- 1 Eclipseで「サーバーに追加または除去できるリソースがありません。」の原因と対処法
- 2 tomcat の起動 / 停止ログと catalina.log・catalina.out の違い
- 3 JavaScript で base URL を取得する方法|window.location.origin
- 4 YouTube Data API v3 エラー一覧|403・400・404 の原因と対処
- 5 Laravel エラー一覧|500/Blade/DB 接続/ルーティングの代表エラー
- 6 3Dグラフィックスとは|モデリング/レンダリング/主要ソフトウェア (Blender / Maya)
- 7 Spring Frameworkのアノテーション一覧
- 8 【Spring】@Valueアノテーションとは
- 9 CATALINA_HOME の確認方法 (Linux / Mac)
- 10 【Spring】@Autowiredアノテーションとは
最近更新/作成されたページ
- Git pushした変更の取消し|revert・履歴変更と保護の注意点 2026-10-15 23:49:01
- Gitでローカルを戻す前に|reset・restoreの違いと退避範囲 2026-10-15 23:49:01
- Git rebaseの使い方|対象範囲・競合解決・pushの判断 2026-10-15 22:50:59
- Git pullの使い方|取込み先・ff-only・競合とstashの注意点 2026-10-15 22:50:59
- Git pushの使い方|送信先・タグ・force-with-leaseの条件 2026-10-15 22:12:47
- Git remoteの設定・確認・削除|SSH URLとfetch/pushの違い 2026-10-15 22:12:47
- Gitリモートリポジトリの作成|初回push・既存履歴・mirrorの注意 2026-10-15 15:48:16
- Gitのuser.name・user.email設定|local/global・確認と過去履歴の注意 2026-10-15 15:30:07
- LinuxにGitをインストール|配布元・初期設定・TLSと認証の確認 2026-10-15 15:30:06
- Git導入と初回push|Linuxサーバー・Windows/macOS・SSH設定 2026-10-15 14:51:54
- Db2のCREATE INDEX|索引定義・INCLUDEと実行計画の確認 2026-10-15 14:10:22
- Db2の自動採番|IDENTITY・ID取得とRESTARTの注意点 2026-10-15 14:10:22
- 【DB2】特定スキーマの全テーブルの全カラム情報を取得する方法 2026-10-15 13:53:15
- Db2のシーケンスとIDENTITYの違い|採番とカタログの確認SQL 2026-10-15 13:53:15
- Db2で複数カラムをUPDATEする方法|SET・WHEREと更新前の値 2026-10-15 13:53:15