【发布时间】:2012-08-16 11:09:05
【问题描述】:
在Understanding django.shortcuts.redirect 中,我发起了一个关于reverse 和redirect_to 的帖子。
当第一个参数是字符串时,我仍然无法理解reverse 的工作原理。我多次阅读https://docs.djangoproject.com/en/1.4/topics/http/shortcuts/#django.shortcuts.redirect 和reverse 的相应部分。但我仍然收到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 似乎期待像“a.b”这样的东西,这就是为什么在callable 中,第一行为func_name 返回了“索引”,但为mod_name 返回了一个空字符串。我将第二行更改为
print "reversing 2 index: %s " % reverse('monitor.views.index')
它按预期工作。那么,为什么我需要使用完整的模块和函数名称(当我使用字符串时)调用 reverse 而文档不需要呢?我错过了什么?
谢谢
【问题讨论】:
-
据我所知,reverse 希望能够通过
name参数或被调用函数的完全限定路径找到URL 模式。 -
在
monitor.urls中使用url()作为urlpatterns 的一项(与ROOT_URLCONF相同) -url()具有可选的name属性,这是可以用作字符串的字符串“反向”参数 -
@yedpodtrzitko:我不能完全理解你的意思:(
标签: django