如何在Django urls.py中将url参数传递给reverse_lazy

时间:2012-03-26 20:25:16

标签: django django-urls

考虑到我有1个资源和2个网址(让我们说新的和旧的)连接到该资源。所以,我想为其中一个网址设置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(那么,在上面的例子中代替<???>的内容是什么?)

6 个答案:

答案 0 :(得分:17)

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

答案 1 :(得分:7)

如果您使用的是硬编码网址,则重定向视图非常有用,它取代了现在已弃用的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的location_id参数向下传递给lambda函数。

答案 2 :(得分:4)

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

答案 3 :(得分:3)

一般问题的可能解决方案之一是使用硬编码的网址格式而不是reverse_lazydocumentation

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

但是,我不太喜欢它,因为它会让我更难以对网址进行可能的更改。

答案 4 :(得分:1)

在调用视图之前,您无法知道或获取值,因此请在其中计算url

答案 5 :(得分:0)

Django的url正则表达式匹配方法允许定义和分配变量:

?P<variable_name>...)定义variable_name取决于被调用的uri;因此您需要提出的是:param而不是<???>