我在理解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
失败而{1}}失败? abc/
如何知道重定向还应包含reverse
?如果我在主urls.py中有另一个名为monitor/
且又有xyz
视图的应用,该怎么办?
答案 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。