了解django.shortcuts.redirect
问题内容:
我有几个问题,如何理解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中有另一个名为view的应用程序xyz
,该abc
怎么办?
问题答案:
为什么反向失败的原因是“ abc”而不是“ abc /”?
因为它将其解释为视图名称(并且您确实有一个名为的视图'abc'
,请参见monitor.urls
文件)。这意味着Django将调用reverse
以计算URL。该值abc/
被解释为实际URL,这意味着Django将不会调用reverse
以确定该URL。
这也解释了为什么reverse
失败:具有名称的视图abc
还需要一个名为的参数id
。否则Django将无法查找URL,因为abc
没有参数的情况下不会调用任何视图。
根据文档,您应该能够使用以下方法来反转URL:
redirect("abc", id=...)
参数...
的值在哪里id
。
反向如何知道重定向也应包括monitor /?
那是因为它知道可用的URL,并且1)它知道在何处abc
定义了被调用的视图,以及2)它知道前面monitors.urls
包含了该视图monitor/
。
如果我在主urls.py中拥有另一个名为“ xyz”的应用程序,该应用程序也具有“ abc”视图,该怎么办?
在这种情况下,您必须使用名称空间。