【发布时间】:2014-12-24 05:28:24
【问题描述】:
我在反向查找方面遇到了一些奇怪的问题。这是我的网址方案。
url(r'^overview/', 'ledger.views.overview', name='overview'),
url(r'^overview/(?P<tutorial>\w+)$', 'ledger.views.overview', name='overview_tutorial'),
当我调用return redirect('overview_tutorial', tutorial='tutorial') 时,它不是在加载教程版本,而是在加载普通版本,这对我来说很奇怪。我认为通过指定 url 的名称,它将使用该 url,但它与第一个 url 匹配。在 url 方案的末尾添加 $ 即可解决问题:
url(r'^overview/$', 'ledger.views.overview', name='overview'),
url(r'^overview/(?P<tutorial>\w+)$', 'ledger.views.overview', name='overview_tutorial'),
但我仍然不明白它为什么这样做。我真正想做的是有一个这样的 url 方案:
url(r'^overview/', 'ledger.views.overview', name='overview'),
url(r'^overview/(?P<tutorial>\w+)$', 'ledger.views.overview', name='overview_tutorial'),
url(r'^overview/(?P<success>\w+)$', 'ledger.views.overview', name='overview_success'),
url(r'^overview/(?P<error>\w+)$', 'ledger.views.overview', name='overview_error')
然后我可以重定向到适当的 url 名称并传入不同的参数。即:
return redirect('overview_success', success='True') #or
return redirect('overview_error', error='Login failed. Please try your username/password again')
但它们都返回,好像我刚刚调用了教程视图。 (我现在意识到这是因为反向 url 查找必须构建 url,然后通过 url 模式运行它以查看它应该指向的位置)。
然后我尝试这样做:
url(r'^overview/(?P<tutorial>\w+)$', 'ledger.views.overview', name='overview'),
url(r'^overview/(?P<tutorial>\w+)/(?P<success>\w+)$', 'ledger.views.overview', name='overview_success'),
url(r'^overview/(?P<tutorial>\w+)/(?P<success>\w+)/(?P<error>\w+)$', 'ledger.views.overview', name='overview_error'),
但是当我调用return redirect("overview_success", tutorial='', success="Hooray") 时,我再次收到错误:
Reverse for 'overview_success' with arguments '()' and keyword arguments '{'success': 'Hooray', 'tutorial': ''}' not found. 1 pattern(s) tried: ['overview/(?P<tutorial>\\w+)/(?P<success>\\w+)$']
【问题讨论】:
-
添加
$锚点有什么问题? -
我可以添加 '$' 锚点,但是如果我指定一个名称,它不应该直接跳到那个方案吗?
-
问题是没有
$anchor,你的第一条规则总是匹配所有这些URL以overview/开头。因此,您需要使用$anchor 标记字符串的结尾。 -
您在编辑时遇到的错误是因为没有匹配...您告诉它名为
tutorial的命名组应该匹配\w+,但您给它一个空字符串。您还错误地使用了命名组,它们不应该用于向视图发送消息,有消息传递框架。查看有关如何使用命名组的文档:docs.djangoproject.com/en/1.7/topics/http/urls/#named-groups
标签: django django-urls urlconf