我在反向查找时遇到了一些奇怪的问题。这是我的网址方案。
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 方案的末尾添加 a可以解决问题:
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 名称并传入不同的参数。IE:
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+)$']