我在理解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视图,会怎么样?
发布于 2012-08-14 00:38:08
为什么'abc‘的冲销失败,而'abc/’没有?
因为它将其解释为视图名(并且您确实有一个名为'abc'的视图,请参见monitor.urls文件)。这意味着Django将调用reverse来计算URL。值abc/被解释为实际的URL,这意味着Django不会调用reverse来确定URL。
这也解释了reverse失败的原因:名为abc的视图还需要一个名为id的参数。否则Django将无法查找URL,因为没有参数就没有名为abc的视图。
基于the documentation,您应该能够使用以下命令来反转URL:
redirect("abc", id=...)其中...是id参数的值。
以及reverse如何知道重定向也应该包括监视器/?
这是因为它知道哪些URL是可用的,1)它知道名为abc的视图定义在哪里,2)它知道monitors.urls包含在前面的monitor/中。
如果我在主urls.py中有另一个名为"xyz“的应用程序,它也有一个"abc”视图,那会怎么样?
在这种情况下,您必须使用namespaces。
https://stackoverflow.com/questions/11938458
复制相似问题