1

了解 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.callabledjango.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使用完整的模块和函数名称(当我使用字符串时)调用而文档不需要呢?我错过了什么?

谢谢

4

2 回答 2

2

你应该做类似的事情

reverse('monitor:index')

ROOT_URLCONF我有

urlpatterns = patterns('',
   (r'^$', redirect_to, {'url': '/monitor/'}),
   (r'^monitor/', include('monitor.urls'),namespace='monitor'),
)

并在monitor.url.py

urlpatterns = patterns('monitor.views',
   url(r'^$', 'index',name='index'),
)

有关更多详细信息,请查看https://docs.djangoproject.com/en/1.4/topics/http/urls/#django.core.urlresolvers.reverse

于 2012-08-16T11:26:10.777 回答
2

我不确定您挂断了文档的哪一部分,但reverse的第一个参数是一些获取视图的识别方法:它可以是 urlpattern 名称、视图的完整虚线路径,或者查看自己

因此,根据您的示例,第一种方法已失效,因为您没有为 urlpattern 定义名称。您的第一次尝试成功了,reverse(index)因为您确实通过了视图。您的第二次尝试reverse('index')不起作用,因为它需要完整的导入上下文,即'monitor.views.index'. 两者之间的区别在于,当它是一个字符串时,Django 必须解释该字符串来为视图创建一个导入——而“索引”不足以确定导入路径。

但是,如果您打算反转它们,最好只命名您的视图,并且您还应该命名您包含的 urlpatterns,这样两个不同的应用程序就不会最终发生冲突。所以在项目级 urls.py 中:

urlpatterns = patterns('',
    url(r'^$', redirect_to, {'url': '/monitor/'}),
    url(r'^monitor/', include('monitor.urls', namespace='monitor', app_name='monitor')),
)

然后,在 monitor/urls.py 中:

urlpatterns = patterns('monitor.views',
    (r'^$', 'index', name='index'),
    (r'^list', 'listall', name='listall'),
)

然后,反转就像reverse('monitor:index').

于 2012-08-16T17:45:01.113 回答