2012-03-26 75 views
17

私は1つのリソースと2つのURL(新しいものと古いもの)をそのリソースに接続しているとします。だから、私はURLの1つのHTTPリダイレクトを設定したい。私が指定したいmycoolapp/urls.pyURLパラメータをDjangoのreverse_lazyに渡す方法urls.py

urlpatterns = patterns('', 
    url(r'^(?P<param>\d+)/resource$', 
         'myapp.views.resource', 
         name='resource-view' 
    ), 
) 

を::

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' 
           ), 
         } 
    ), 
) 

質問がreverse_lazy kwargsからに<param>を渡す方法(そう、<???>の代わりに置くために何である私が持っているmyapp/urls.py

上記の例では)?

答えて

3

ワン<???>の:そうあなたが置くために必要なものであり、?P<variable_name>...)が呼び出されているuriに応じvariable_nameを定義します(

+0

ドキュメントリンクのkwargs''である参照として、真実ではないのですか?ページが見つかりません – grgizem

+0

@ grgizem投稿は半年前に作成されました..ごめんなさい。とにかく、私はリンクを更新しました – gakhov

1

ビューが呼び出されるまで値がわからない、または値を取得できないので、その内部にurlを計算します。 param代わり

0

URLのDjangoの正規表現のマッチング方法は、1つの定義と変数を割り当てることができます一般的な問題の可能な解決策の1つは、reverse_lazydocumentation)の代わりにハードコードされたURLパターンを使用することです。

しかし、私はそれがとても好きではない。なぜなら、URLの変更を可能にした後では、より難しくなるからだ。

+0

あなたは 'が' 'reverse_lazy' – gakhov

15

私はurls.pyで直接これをしないだろう、私が代わりにリダイレクトするビューを計算するために、クラスベースのRedirectViewを使用したい:あなたのurls.pyにあなたがこれを行うことができ、その後

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') 

urlpatterns = patterns('', 
    url(r'^coolresource/(?P<param>\d+)/$', 
     RedirectSomewhere.as_view()), 
) 
5

ハードコードされた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パラメータは、ラムダ関数に渡されます。

+0

これはここで最も賢明な解決策です –

2

あなたがこの(Documentation)を行うことができますジャンゴ1.6のとおり:

... 
from django.views.generic.base import RedirectView 

urlpatterns = patterns('', 
    url(r'^coolresource/(?P<param>\d+)/$', 
     RedirectView.as_view(pattern_name='resource-view'), 
    ), 
) 
+0

パターンにargsまたはkwargsを渡したい場合、これはどのように機能しますか? – Flimm

+0

@Flimmこの回答は役に立ちましたか?http://stackoverflow.com/a/12150035/742390 – Pykler

関連する問題