了解django.shortcuts.redirect

时间:2012-08-13 16:32:43

标签: python django django-views django-urls

我在理解redirectreverse的确如何运作方面遇到了一些问题。

在主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/")
然后它突然起作用了。

我无法完全理解为什么。为什么reverseabc失败而{1}}失败? abc/如何知道重定向还应包含reverse?如果我在主urls.py中有另一个名为monitor/且又有xyz视图的应用,该怎么办?

1 个答案:

答案 0 :(得分:3)

  

为什么反向失败了'abc'而不是'abc /'?

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

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

基于the documentation,您应该可以使用以下方式撤消网址:

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

其中...id参数的值。

  

逆向如何知道重定向应该还包括monitor /?

这是因为它知道哪些URL可用,1)它知道定义了abc的视图的位置,2)它知道前面有monitors.urls monitor/

  

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

在这种情况下,您必须使用namespaces