理解django.shortcuts.reverse,第2部分

理解django.shortcuts.reverse,第2部分,django,Django,在年,我开始了一个关于反向和重定向的线程 当第一个参数是字符串时,理解reverse如何工作仍然有一些问题。我读了很多遍,相应的部分用了倒装。但我仍然得到一个NoReverseMatch异常 在我的根里,我有 在monitor.url中,我有 在monitor.url中,我为函数index和listall定义了代码。在listall中,我添加了以下行: def listall(request): <more code goes here> print "reversi

在年,我开始了一个关于反向和重定向的线程

当第一个参数是字符串时,理解reverse如何工作仍然有一些问题。我读了很多遍,相应的部分用了倒装。但我仍然得到一个NoReverseMatch异常

在我的根里,我有

在monitor.url中,我有

在monitor.url中,我为函数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)
除此之外,第二个反面引发了一个例外。为什么?我错过了什么

我追踪到djangos代码django.core.urlResolver.callable和django.core.urlResolver.get_mod_func。get_mod_func似乎期望类似于a.b的内容,这就是为什么在callable中,第一行返回func_name的索引,而mod_name返回空字符串的原因。我把第二行改为

    print "reversing 2 index: %s " % reverse('monitor.views.index')
它按预期工作。那么,当我使用字符串而文档没有使用时,为什么我需要用完整的模块和函数名调用reverse呢?我错过了什么


谢谢

你应该这样做

reverse('monitor:index')
在ROOT_URLCONF中,我有

在monitor.url.py中:


有关更多详细信息,请参阅

您应该做如下操作

reverse('monitor:index')
在ROOT_URLCONF中,我有

在monitor.url.py中:


有关更多详细信息,请参阅

我不确定您挂起的文档的哪一部分,但reverse的第一个参数是获取视图的某种标识方法:它可以是urlpattern名称、视图的完整点路径,也可以是视图本身

因此,根据您的示例,第一个方法不适用,因为您没有为urlpattern定义名称。您的第一次尝试reverseindex成功了,因为您确实将视图传递给了它。您的第二次尝试反向“index”无效,因为它需要完整的导入上下文,即“monitor.views.index”。两者之间的区别在于,当它是一个字符串时,Django必须解释该字符串以创建视图的导入,而“索引”的信息不足以确定导入路径

然而,如果您打算反转视图,那么只命名视图要好得多,而且您还应该为包含的urlpatterns命名名称空间,这样两个不同的应用程序就不会发生冲突。因此,在项目级URL.py中:

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

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

然后,反转就像反转“monitor:index”一样简单。

我不确定您挂起文档的哪一部分,但是反转的第一个参数是获取视图的某种标识方法:它可以是urlpattern名称、视图的完整点路径,也可以是视图本身

因此,根据您的示例,第一个方法不适用,因为您没有为urlpattern定义名称。您的第一次尝试reverseindex成功了,因为您确实将视图传递给了它。您的第二次尝试反向“index”无效,因为它需要完整的导入上下文,即“monitor.views.index”。两者之间的区别在于,当它是一个字符串时,Django必须解释该字符串以创建视图的导入,而“索引”的信息不足以确定导入路径

然而,如果您打算反转视图,那么只命名视图要好得多,而且您还应该为包含的urlpatterns命名名称空间,这样两个不同的应用程序就不会发生冲突。因此,在项目级URL.py中:

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

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

然后,反转就像反转“monitor:index”一样简单。

据我所知,反转希望能够通过其名称参数或被调用函数的完全限定路径找到URL模式。在monitor中使用URL作为urlpatterns的一项。URL与根目录中的URL相同-URL具有可选的名称属性,这是一个字符串,可以用作“reverse”的字符串参数@yedpodtrzitko:我不能完全理解你的意思:据我所知,reverse希望能够通过它的name参数找到URL模式,或者被调用函数的完全限定路径。将url用作monitor中的urlpatterns项。url与ROOT_URLCONF中的相同-url具有可选的名称属性,该属性是可以用作“reverse”@yedpodtrzitko的字符串参数的字符串:我无法完全理解您的意思:r“^$”,“index”,name='index',生成和语法错误:r'^$'、'index',name='index',生成和语法错误:
urlpatterns = patterns('',
    url(r'^$', redirect_to, {'url': '/monitor/'}),
    url(r'^monitor/', include('monitor.urls', namespace='monitor', app_name='monitor')),
)
urlpatterns = patterns('monitor.views',
    (r'^$', 'index', name='index'),
    (r'^list', 'listall', name='listall'),
)