DjangoのURLディスパッチャは、pathとre_pathという2つの主要な方法を提供しています。これらを使用して、リクエストを適切なビュー関数にルーティングします。
from django.urls import path, re_path
from myapp.views import custom_view, regex_view, regex_view_month
urlpatterns = [
path('admin/', admin.site.urls),
path('product/<pid:product_id>/', custom_view),
re_path(r'^article/(?P<year>\d{4})/$', regex_view),
re_path(r'^article/(?P<year>\d{4})/(?P<month>\d{2})/$', regex_view_month),
]
カスタムパスコンバータ
path関数では、URLの一部を特定のデータ型に変換するカスタムコンバータを定義できます。これにより、ビュー関数に適切なPythonオブジェクトが渡されます。
まず、コンバータクラスを定義します。
class slugConverter:
pattern = r'[a-z0-9-]+' # スラッグ用の正規表現パターン
def to_python(self, value):
# URLから受け取った文字列をPythonオブジェクトに変換
return value.lower()
def to_url(self, value):
# PythonオブジェクトをURL文字列に変換
return value
次に、このコンバータを登録します。
from django.urls import register_converter
register_converter(slugConverter, 'slug')
これで、<slug:my_slug>のようにURLパターンで使用できるようになります。
URLパラメータのデフォルト値
URLパラメータにはデフォルト値を設定できます。これは2つの方法で行うことができます。
-
ビュー関数の引数にデフォルト値を設定する方法。この場合、対応するURLパターンにもパラメータが必要です。
from django.http import HttpResponse def default_view(request, page=1): return HttpResponse(f'ページ番号: {page}')path('page/<int:page>/', default_view), path('page/', default_view), # pageパラメータが省略された場合 -
path関数の第3引数(キーワード引数)としてデフォルト値を渡す方法。def default_view_with_kwarg(request, info): return HttpResponse(f'情報: {info}')path('info/', default_view_with_kwarg, {'info': 'デフォルトメッセージ'}),
カスタムエラーページ
特定のHTTPステータスコード(404 Not Foundなど)に対してカスタムエラーページを表示できます。プロジェクトのurls.pyでハンドラを設定します。
handler404 = 'custom_errors.views.not_found_view'
handler500 = 'custom_errors.views.server_error_view'
ここで、custom_errorsはアプリケーション名、not_found_viewはエラーページをレンダリングするビュー関数です。
他のURL設定のインクルード
他のアプリケーションのURL設定をインクルードして、プロジェクトのURL構造をモジュール化できます。一般的には、各アプリケーションに独自のurls.pyを作成し、それをメインのurls.pyからインクルードします。
# blog_app/urls.py
from django.urls import path
from .views import blog_list_view, blog_detail_view
app_name = 'blog'
urlpatterns = [
path('', blog_list_view, name='list'),
path('<int:post_id>/', blog_detail_view, name='detail'),
]
# プロジェクトのurls.py
from django.urls import include, path
urlpatterns = [
path('blog/', include('blog_app.urls')),
path('about/', include('about_app.urls')),
]
include関数は、指定されたURL設定を現在のURLスペースに組み込みます。これにより、URLの管理が非常に効率的になります。