我有一些反向查找的奇怪问题。这是我的网址方案。
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+)$']
答案 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