urls.py重定向与URL反转和参数 - 有更简单的方法吗?

时间:2011-06-15 16:27:55

标签: python django coding-style

鉴于两类实体,我选择了一些具有以下网址定义的交叉产品集:

url(r"^category1/(?P<category1>([0123456789]+,?)+)/category2(?P<category2>([0123456789]+,?)+)/$", view, {}, name="cross")

所以基本上像/category1/1,2,3,4/category2/5,6,7,8/这样的网址都有效。

现在我在同一数据上引入了几个视图,现在我有/category1/1,2,3,4/category2/5,6,7,8/view1//category1/1,2,3,4/category2/5,6,7,8/view2/等网址。我想将“旧”网址重定向到view1。我没有发现比这更容易的事情:

url(r"^category1/(?P<category1>([0123456789]+,?)+)/category2(?P<category2>([0123456789]+,?)+)/$",
    redirect_to, {
    'url': lazy(lambda: reverse(
        'cross_view1',
        kwargs={
            'category1': '111111',
            'category2': '222222',
        }
     ).replace('111111', '%(category1)s') \
      .replace('222222', '%(category2)s'), str)(),
     name="cross"}

这里的要点是我想在URL中重用我匹配的组,但是,我不能将它们作为kwargs给redirect_to,因为它们不会被插值,也不能将逐字格式化URL,因为它必须匹配我的正则表达式(逗号分隔的数字ID)。所以我介绍一些独特的ID(在这种情况下为111111和222222)并在之后替换它们。

显然,这种感觉,外观,气味和味道非常黑客。除了引入额外的视图并完全跳过redirect_to之外,还有更简洁的方法吗?

2 个答案:

答案 0 :(得分:1)

你有一些选择。你可以使用RedirectView,但我无法让它反转url,因为它看起来像在urlpatterns加载之前运行。您可以像这样使用它,定制它以在您的项目中使用:

from django.views.generic import RedirectView

将此添加到您的urlpatterns:

url(r'^(?P<location_id>\d+)/$', RedirectView.as_view(url='/statistics/dailyreport/%(location_id)s/')),

使用LAMBDA :这应该适用于大多数版本的django,我在1.6.5中使用它:

from django.core.urlresolvers import reverse
from django.http import HttpResponseRedirect
urlpatterns = patterns('',
    ....
    url(r'^(?P<location_id>\d+)/$', lambda x, location_id: HttpResponseRedirect(reverse('dailyreport_location', args=[location_id])), name='location_stats_redirect'),
    ....
)

答案 1 :(得分:0)

请注意,在你的reg exp中你可以使用[0-9]而不是[0123456789]