【问题标题】:urls.py redirect with URL reversal and parameters -- is there any easier way?带有 URL 反转和参数的 urls.py 重定向 - 有没有更简单的方法?
【发布时间】:2011-09-15 16:54:51
【问题描述】:

给定两类实体,我将选择它们的某种交叉产品集,并具有以下 URL 定义:

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/ 这样的 URL。我想将“旧”网址重定向到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 之外,还有什么更简洁的方法吗?

【问题讨论】:

  • 想问一下(我是 Django 新手:我的大部分 Python 工作都是在 Turbogears 中完成的),但为什么 url(r"^category1/(?P&lt;category1&gt;([0123456789]+,?)+)/category2(?P&lt;category2&gt;([0123456789]+,?)+)/$", redirect_to, {'url': '/category1/%(category1)s/category2/%(category2)s/view1',}) 不工作?
  • @Femi:因为我想重用我的 URL 构建方案。如果我改变它(这在这个阶段是完全可能的),我不需要追踪我可以使用 URL 连接的每个地方。 URL 反转也应该是 Django 开发的“干净”方式——正如我们从代码中看到的那样,这并不完全明显;)
  • 为什么不能引入额外的视图?
  • @André Caron:这不是完全不可能的,无论如何我可能不得不介绍它,但是我想知道使用 Django 提供的通用视图的怪癖,尤其是它们与最佳实践的联系由 Django 推广并为 Django 推广。如果使用redirect_toreverse 意味着编写像我写的那样丑陋的代码,那么除了非常简单的情况外,我不会费心使用redirect_to。如果还有其他方法,我想了解一下——因此提出了这个问题。
  • 这看起来可能会回答你的问题:stackoverflow.com/questions/15706489/…

标签: python django coding-style


【解决方案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/')),

USE 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'),
    ....
)

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2016-12-08
      • 2015-11-29
      • 2016-05-21
      • 2022-12-29
      • 2012-07-17
      • 2011-04-21
      • 1970-01-01
      • 2022-07-01
      • 2021-06-12
      相关资源
      最近更新 更多