DjangoのURLディスパッチャ

DjangoのURLディスパッチャは、pathre_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つの方法で行うことができます。

  1. ビュー関数の引数にデフォルト値を設定する方法。この場合、対応する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パラメータが省略された場合
    
  2. 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の管理が非常に効率的になります。

タグ: Django URLルーティング カスタムコンバータ エラーハンドリング include

5月20日 01:16 投稿