2012-03-26 70 views
17

請考慮我有1個資源和2個連接到該資源的urls(比方說新的和舊的)。所以,我想爲其中一個網址設置HTTP重定向。如何將url參數傳遞給Django中的reverse_lazy urls.py

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(所以,放什麼,而不是<???>在上面的例子中)?

回答

3

一一般問題的可能解決方案是使用硬編碼的url模式代替reverse_lazydocumentation

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

但是,我不喜歡這麼多,因爲它使我更難以在網址上做可能的更改。

+0

文檔鏈接的kwargs'?頁面未找到 – grgizem 2012-10-14 11:17:32

+0

@grgizem半年前創建的帖子..對不起。無論如何,我已更新鏈接 – gakhov 2012-10-15 07:58:21

1

在調用視圖之前,您無法知道或獲取該值,因此請在其中計算url

0

Django的對於網址正則表達式匹配的方法允許一個定義和分配變量:

?P<variable_name>...)定義variable_name取決於uri被調用;所以你需要把什麼:的param代替<???>

+0

這是不正確的,因爲你看到了''在''reverse_lazy' – gakhov 2012-03-27 09:41:49

15

我不會直接在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()), 
) 
5

如果您使用硬編碼網址,重定向視圖非常棒,它取代了現在已棄用的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參數傳遞給lambda函數。

+0

這是這裏最明智的解決方案 – 2015-09-06 14:01:26

2

由於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'), 
    ), 
) 
+0

如果您想將args或kwargs傳遞給模式,這是如何工作的? – Flimm 2017-01-05 11:14:41

+0

@Flimm這個答案可能有助於http://stackoverflow.com/a/12150035/742390 – Pykler 2017-01-05 15:14:52

相關問題