我有几个问题,如何理解redirect或者说reverse真正的工作。
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我有:
monitors.urls
from django.conf.urls import patterns, include, url urlpatterns = patterns('monitor.views', (r'^$', 'index'), (r'^abc/(?P<id>.*$)', 'abc'), )
当您打电话时,/monitor我想将其重定向到,/monitor/abc所以我做到了:
/monitor
/monitor/abc
def index(request): return redirect("abc") def abc(render, id=None): return render_to_response("monitor/list.htmld", {})
但是我有一个NoReverseMatch例外。但是当我这样做时:
NoReverseMatch
def index(request): return redirect("abc/")
然后突然起作用。
我不完全明白为什么。为什么reverse失败abc而不是失败abc/?以及如何reverse知道重定向也应包括在内monitor/?如果我在主urls.py中有另一个名为view的应用程序xyz,该abc怎么办?
abc
abc/
monitor/
xyz
为什么反向失败的原因是“ abc”而不是“ abc /”?
因为它将其解释为视图名称(并且您确实有一个名为的视图'abc',请参见monitor.urls文件)。这意味着Django将调用reverse以计算URL。该值abc/被解释为实际URL,这意味着Django将不会调用reverse以确定该URL。
'abc'
monitor.urls
这也解释了为什么reverse失败:具有名称的视图abc还需要一个名为的参数id。否则Django将无法查找URL,因为abc没有参数的情况下不会调用任何视图。
id
根据文档,您应该能够使用以下方法来反转URL:
redirect("abc", id=...)
参数...的值在哪里id。
...
反向如何知道重定向也应包括monitor /?
那是因为它知道可用的URL,并且1)它知道在何处abc定义了被调用的视图,以及2)它知道前面monitors.urls包含了该视图monitor/。
如果我在主urls.py中拥有另一个名为“ xyz”的应用程序,该应用程序也具有“ abc”视图,该怎么办?
在这种情况下,您必须使用名称空间。