在了解 django.shortcuts.redirect 中reverse
,我开始了一个关于and的线程redirect_to
。
reverse
当第一个参数是字符串时,我仍然无法理解如何工作。我多次阅读https://docs.djangoproject.com/en/1.4/topics/http/shortcuts/#django.shortcuts.redirectreverse
和相应的部分。但我仍然有一个NoReverseMatch
例外。
在我的ROOT_URLCONF
我有
urlpatterns = patterns('',
url(r'^$', redirect_to, {'url': '/monitor/'}),
url(r'^monitor/', include('monitor.urls')),
)
在monitor.urls
我有
urlpatterns = patterns('monitor.views',
(r'^$', 'index'),
(r'^list', 'listall'),
)
并且monitor.urls
我已经为这两个函数定义了代码,index
并且listall
. 在listall
我添加了以下几行:
def listall(request):
<more code goes here>
print "reversing 1 index: %s " % reverse(index)
print "reversing 2 index: %s " % reverse('index')
render_to_response("monitor/list.htmld", params)
如果我访问 localhost:3000/monitor/list 那么我可以看到
reversing 1 index: /monitor/
仅此而已,第二个reverse
引发了异常。为什么?我错过了什么?
我追踪到 djangos 代码django.core.urlresolvers.callable
和django.core.urlresolvers.get_mod_func
. get_mod_func
似乎期待像“ab”这样的东西,这就是为什么在callable
第一行返回“index”func_name
但一个空字符串mod_name
。我将第二行更改为
print "reversing 2 index: %s " % reverse('monitor.views.index')
它按预期工作。那么,为什么我需要reverse
使用完整的模块和函数名称(当我使用字符串时)调用而文档不需要呢?我错过了什么?
谢谢