最終投稿日:2022年6月18日
Django(ルーティング)
プロジェクトの urls.py
プロジェクトの urls.py では、各アプリ単位の urls.py へ関連付けを行います。
例)
【注意】
例)
from django.contrib import admin
from django.conf.urls import include, url
from django.views.generic import RedirectView
urlpatterns = [
url(r'^$', RedirectView.as_view(url='hello/')), ※【1】
url(r'^hello/', include('hello.urls', namespace='hello')), ※【2】
url('admin/' , admin.site.urls), ※【3】
]
URL は正規表現で記述し、マッチしたコードを処理する
from django.conf.urls import include, url
from django.views.generic import RedirectView
urlpatterns = [
url(r'^$', RedirectView.as_view(url='hello/')), ※【1】
url(r'^hello/', include('hello.urls', namespace='hello')), ※【2】
url('admin/' , admin.site.urls), ※【3】
]
| 【1】リダイレクト設定 |
何も文字列がない場合なので http://hoge.com/ の様なドメイン名までのURLにマッチする リダイレクト先の URL が hello となっているので【2】にマッチする |
| 【2】各アプリへ飛ばす | http://hoge.com/hello/ でマッチし、hello モジュールの urls.py へ処理が遷移する。また、、第2引数にネームスペース名 hello も記述する。 |
| 【3】アドミン | DJANGO 標準で搭載されている ADMIN ページを使用する場合はこのままで |
ドメインのみの「r'^$'」のパターンを他のアプリに関連付ける場合は、リダイレクトで対応する事!
namespace が重複すると警告が発生します。また、URLの逆引きもできなくなります。
namespace が重複すると警告が発生します。また、URLの逆引きもできなくなります。
アプリの urls.py
★ views.py 関数ベース
各アプリでは、URL パターンとメソッドを関連付けます。
例)
例)
from django.conf.urls import url
from django.views.generic import RedirectView
from . import views
app_name = 'hello' ※namespace 名
urlpatterns = [
url(r'^$', RedirectView.as_view(url='index/')), ※【1】【2】を参照する
url(r'^index/$', views.index1, name='index1'), ※【2】
url(r'^index/(?P\w+)/(?P\w+)$', views.index2, name='index2'), ※【3】
] 【1】ドメイン/hello/ ⇒ 【2】を参照する
【2】ドメイン/hello/index/ ⇒ [hello/views.py] def index1(request) に対応
【3】ドメイン/hello/index/123/aaa ⇒ [hello/views.py] def index2(request,id=0,foo='xxx') に対応
from django.views.generic import RedirectView
from . import views
app_name = 'hello' ※namespace 名
urlpatterns = [
url(r'^$', RedirectView.as_view(url='index/')), ※【1】【2】を参照する
url(r'^index/$', views.index1, name='index1'), ※【2】
url(r'^index/(?P
] 【1】ドメイン/hello/ ⇒ 【2】を参照する
【2】ドメイン/hello/index/ ⇒ [hello/views.py] def index1(request) に対応
【3】ドメイン/hello/index/123/aaa ⇒ [hello/views.py] def index2(request,id=0,foo='xxx') に対応
★ views.py クラスベース
各アプリでは、URL パターンとクラスを関連付けます。
例)
例)
from django.conf.urls import url
from django.views.generic import RedirectView
from .views import IndexView1, IndexView2, IndexView3
※[views.py]よりクラスを読み込む(全部なら * でも良い)
app_name = 'hello'
urlpatterns = [
url(r'^$', RedirectView.as_view(url='index/')), ※【1】【2】を参照する
url(r'^index/$', IndexView1.as_view(), name='index1'), ※【2】
url(r'^index/(?P\w+)/(?P\w+)$', IndexView2.as_view(), name='index2'), ※【3】名前付き引数
url(r'^index3/(\d+)/(\w+)$', IndexView3.as_view(), name='index3'), ※【4】名前なし引数
] 【1】ドメイン/hello/ ⇒ 【2】を参照する
【2】ドメイン/hello/index/ ⇒ [hello/views.py] class IndexView1(View) の def get(self, request) に対応
【3】ドメイン/hello/index/123/aaa ⇒ [hello/views.py] class IndexView2(View) の def get(self, request, *args, **kwargs) に対応
【4】ドメイン/hello/index3/123/aaa ⇒ [hello/views.py] class IndexView3(View) の def get(self, request, *args, **kwargs) に対応
【メモ】
from django.views.generic import RedirectView
from .views import IndexView1, IndexView2, IndexView3
※[views.py]よりクラスを読み込む(全部なら * でも良い)
app_name = 'hello'
urlpatterns = [
url(r'^$', RedirectView.as_view(url='index/')), ※【1】【2】を参照する
url(r'^index/$', IndexView1.as_view(), name='index1'), ※【2】
url(r'^index/(?P
url(r'^index3/(\d+)/(\w+)$', IndexView3.as_view(), name='index3'), ※【4】名前なし引数
] 【1】ドメイン/hello/ ⇒ 【2】を参照する
【2】ドメイン/hello/index/ ⇒ [hello/views.py] class IndexView1(View) の def get(self, request) に対応
【3】ドメイン/hello/index/123/aaa ⇒ [hello/views.py] class IndexView2(View) の def get(self, request, *args, **kwargs) に対応
【4】ドメイン/hello/index3/123/aaa ⇒ [hello/views.py] class IndexView3(View) の def get(self, request, *args, **kwargs) に対応
[?]での GET パラメータを渡したい場合も通常通り URL に埋め込めます。
例)
ドメイン/hello/index/?hoge=123&foo=aaa 【2】のパターンにマッチ
ドメイン/hello/index/123/aaa?hoge=123&foo=bbb 【3】のパターンにマッチ
例)
ドメイン/hello/index/?hoge=123&foo=aaa 【2】のパターンにマッチ
ドメイン/hello/index/123/aaa?hoge=123&foo=bbb 【3】のパターンにマッチ




