2

我有几个问题理解如何redirect或更确切地说reverse是如何工作时遇到了一些问题。

在主要的 urls.py 我有:

from django.conf.urls import patterns, include, url
from django.views.generic.simple import redirect_to

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

并且在monitors.urls我有:

from django.conf.urls import patterns, include, url 

urlpatterns = patterns('monitor.views',
        (r'^$', 'index'),
        (r'^abc/(?P<id>.*$)', 'abc'),
)   

当您打电话时,/monitor我想将其重定向到/monitor/abc所以我这样做了:

def index(request):
    return redirect("abc")

def abc(render, id=None):
    return render_to_response("monitor/list.htmld", {})

但我有一个NoReverseMatch例外。但是当我这样做时:

def index(request):
    return redirect("abc/")

然后它突然起作用了。

我无法完全理解为什么。为什么reverse失败abc但没有失败abc/?以及如何reverse知道重定向也应该包括在内monitor/?如果我在主 urls.py 中有另一个名为的应用程序xyz,它也有一个abc视图怎么办?

4

1 回答 1

3

为什么使用'abc'而反向失败但没有使用'abc /'?

因为它将它解释为视图名称(并且您确实有一个名为 的视图'abc',请参阅您的monitor.urls文件)。这意味着 Django 将调用reverse来计算 URL。该值abc/被解释为一个实际的 URL,这意味着 Django 不会调用reverse来确定 URL。

这也解释了reverse失败的原因:带有名称的视图abc还需要一个名为id. 否则 Django 将无法查找 URL,因为没有调用abc没有参数的视图。

根据文档,您应该能够使用以下方法反转 URL:

redirect("abc", id=...)

其中...id参数的值。

以及 reverse 如何知道重定向也应该包括 monitor/ ?

这是因为它知道哪些 URL 可用,并且 1) 它知道调用的视图在哪里abc定义,以及 2) 它知道前面monitors.urls包含的内容。monitor/

如果我在主 urls.py 中有另一个名为“xyz”的应用程序,它也有一个“abc”视图怎么办?

在这种情况下,您必须使用命名空间

于 2012-08-13T16:38:08.237 回答