2012-03-26 180 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