web-dev-qa-db-ja.com

Django urls.pyでURLパラメータをreverse_lazyに渡す方法

そのリソースに接続されている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に渡す方法です(つまり、上記の例では<???>の代わりに何を置くか)。

22
gakhov

一般的な問題の考えられる解決策の1つは、reverse_lazyの代わりにハードコードされたURLパターンを使用することです( documentation

url(r'^coolresource/(?P<param>\d+)/$', 
                       redirect_to, 
                       {'url': '/%(param)s/resource'}
),

しかし、URLの変更を行うのが難しいので、あまり好きではありません。

3
gakhov

私はこれを直接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()),
)
20
slurms

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パラメータがラムダ関数に渡されます。

7
radtek

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'),
    ),
) 
4
Pykler

ビューが呼び出されるまで、値が何であるかを知ることができないため、その内部でurlを計算します。

Djangoのurlの正規表現照合方法では、変数を定義して割り当てることができます。

?P<variable_name>...)は、呼び出されるuriに応じてvariable_nameを定義します。したがって、必要なのは、<???>ではなくparamです。

0
Umur Kontacı