そのリソースに接続されている1つのリソースと2つのURL(新しいものと古いものとしましょう)があると考えてください。だから、私はURLの1つにHTTPリダイレクトを設定したいと思います。
myapp/urls.py
では、
urlpatterns = patterns('',
url(r'^(?P<param>\d+)/resource$',
'myapp.views.resource',
name='resource-view'
),
)
mycoolapp/urls.py
では、次のように指定します。
from Django.views.generic.simple import redirect_to
from Django.core.urlresolvers import reverse_lazy
urlpatterns = patterns('',
url(r'^coolresource/(?P<param>\d+)/$',
redirect_to,
{
'url': reverse_lazy('resourse-view',
kwargs={'param': <???>},
current_app='myapp'
),
}
),
)
問題は、<param>
をreverse_lazy
kwargsに渡す方法です(つまり、上記の例では<???>
の代わりに何を置くか)。
一般的な問題の考えられる解決策の1つは、reverse_lazy
の代わりにハードコードされたURLパターンを使用することです( documentation )
url(r'^coolresource/(?P<param>\d+)/$',
redirect_to,
{'url': '/%(param)s/resource'}
),
しかし、URLの変更を行うのが難しいので、あまり好きではありません。
私はこれを直接urls.py
、代わりにクラスベースのRedirectView
を使用して、リダイレクト先のビューを計算します。
from Django.views.generic.base import RedirectView
from Django.core.urlresolvers import reverse_lazy
class RedirectSomewhere(RedirectView):
def get_redirect_url(self, param):
return reverse_lazy('resource-view',
kwargs={'param': param},
current_app='myapp')
次に、urls.py
あなたはこれを行うことができます:
urlpatterns = patterns('',
url(r'^coolresource/(?P<param>\d+)/$',
RedirectSomewhere.as_view()),
)
Redirect Viewは、ハードコードされたURLを使用している場合に最適です。redirect_toに代わって廃止されました。 urls.pyからリダイレクトおよびリバースするときに使用できないと思います。これが私の解決策です、この場合のxは応答オブジェクトです:
from Django.core.urlresolvers import reverse
from Django.http import HttpResponseRedirect
urlpatterns = patterns('',
....
url(r'^coolresource/(?P<param>\d+)/$',
lambda x, param: HttpResponseRedirect(
reverse('myapp.views.resource', args=[param])
),
name='resource-view-redirect'),
....
)
このソリューションでは、ハードコードされたURLの代わりに、URLパターンの名前を使用できます。 URLのlocation_idパラメータがラムダ関数に渡されます。
Django 1.6以降では、これを行うことができます( Documentation ):
...
from Django.views.generic.base import RedirectView
urlpatterns = patterns('',
url(r'^coolresource/(?P<param>\d+)/$',
RedirectView.as_view(pattern_name='resource-view'),
),
)
ビューが呼び出されるまで、値が何であるかを知ることができないため、その内部でurl
を計算します。
Djangoのurlの正規表現照合方法では、変数を定義して割り当てることができます。
(?P<variable_name>...)
は、呼び出されるuri
に応じてvariable_name
を定義します。したがって、必要なのは、<???>
ではなくparam
です。