Django url模式具有可选参数的反向查找问题

时间:2014-10-28 17:23:04

标签: django django-urls urlconf

我有一些反向查找的奇怪问题。这是我的网址方案。

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

1 个答案:

答案 0 :(得分: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(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