0

我在反向查找时遇到了一些奇怪的问题。这是我的网址方案。

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+)$']
4

1 回答 1

0

看起来您正在尝试使用您的urlconf来接受要发送给用户的消息。例如你的错误信息

return redirect('overview_error', error='Login failed. Please try your username/password again')

然而,这不是命名组的urlconf用途。它们用于匹配 url 模式以确定要呈现的视图。因此,当您调用redirect它时,它不仅仅是将您发送到一个新的网址,而是根据您传递的内容解析该网址。

在您的第二个示例中,您的redirect电话

return redirect("overview_success", tutorial='', success="Hooray")

正在尝试与您的 url 模式匹配

url(r'^overview/(?P<tutorial>\w+)/(?P<success>\w+)$', 'ledger.views.overview', name='overview_success'),

正如你所看到的那样overview//Hooray,它不是一个有效的模式,因为传递给tutorial它的空字符串需要 1 个或多个“单词”字符。

您可以使用消息传递框架向用户发送消息。https://docs.djangoproject.com/en/1.7/ref/contrib/messages/#module-django.contrib.messages

于 2014-10-28T17:58:00.147 回答