【问题标题】:Django URLconf: How to use captured params in include's RedirectView?Django URLconf:如何在包含的 RedirectView 中使用捕获的参数?
【发布时间】:2015-03-22 12:54:26
【问题描述】:

我有一个父 URLconf:

from django.conf.urls import include, patterns, url

urlpatterns = patterns('',
    (r'^main/(?P<name>[^/]+)/(?P<region>[^/]+)/(?P<id>[^/]+)/', include('foo')),
)

还有一个包含重定向的子 URLconf(包含在父 URL 中):

from django.conf.urls import patterns, url

urlpatterns = patterns('',
    url(r'^view/$', RedirectView.as_view(url='/main/%(name)s/%(region)s/%(id)s/detail')),
)

(本质上,我正在尝试将看起来像 /main/product/1/134/view 的路径重定向到看起来像 /main/product/1/134/detail 的路径。)

Django documentation 表示“包含的 URLconf 从父 URLconf 接收任何捕获的参数。”

但是当我尝试访问 /main/product/1/134/view 时,我得到了一个 KeyError,因为 name 未被识别。

是否有其他方法可以在 RedirectView 中引用接收到的捕获参数?

注意:当我在父 URLconf 中执行整个操作时,我没有收到错误:

urlpatterns = patterns('',
    (r'^main/(?P<name>[^/]+)/(?P<region>[^/]+)/(?P<id>[^/]+)/view/$', RedirectView.as_view(url='/main/%(name)s/%(region)s/%(id)s/detail'))
)

【问题讨论】:

  • 您可以通过引用组索引号\1 或名称来引用捕获的组。

标签: python django url-redirection url-pattern urlconf


【解决方案1】:

This section of the docs 建议您应该使用两个百分号而不是一个:

给定的 URL 可能包含字典样式的字符串格式,它将根据 URL 中捕获的参数进行插值。因为总是进行关键字插值(即使没有传入参数),所以 URL 中的任何“%”字符都必须写为“%%”,以便 Python 将它们转换为输出时的单个百分号。

所以在你的情况下,试试:

url(r'^view/$', RedirectView.as_view(url='/main/%%(name)s/%%(region)s/%%(id)s/detail')),

使用pattern_name 参数而不是url 可能更简洁。 argskwargs 将用于反转新的 url。

url(r'^view/$', RedirectView.as_view(pattern_name='name_of_url_pattern_to_redirect_to')),

【讨论】:

  • 当我使用 "%%" 时,它在输出中解析为 "%",但不执行任何字符串替换,因此它重定向到的 URL 是 '/main/%(name)s/%(region)s/%(id)s/detail(这当然是无效的) .
猜你喜欢
  • 1970-01-01
  • 2014-07-03
  • 2011-03-01
  • 1970-01-01
  • 2013-07-05
  • 2013-09-19
  • 2014-11-22
  • 1970-01-01
  • 2018-10-22
相关资源
最近更新 更多