python – 了解django.shortcuts.redirect
作者:互联网
我在理解重定向或反向实际工作方面有几个问题.
在主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/")
然后它突然起作用.
我不能完全理解为什么.为什么反向失败了abc而不是abc /?逆向如何知道重定向应该还包括monitor /?如果我在主urls.py中有另一个名为xyz的app也有abc视图怎么办?
解决方法:
Why did reverse fail with ‘abc’ but not with ‘abc/’?
因为它将其解释为视图名称(并且您确实有一个名为’abc’的视图,请参阅您的monitor.urls文件).这意味着Django将调用reverse来计算URL.值abc /被解释为实际的URL,这意味着Django不会调用reverse来确定URL.
这也解释了为什么反向失败:名称为abc的视图也需要一个名为id的参数.否则Django将无法查找URL,因为没有没有参数的abc视图.
基于the documentation,您应该能够使用以下方式撤消URL:
redirect("abc", id=...)
其中…是id参数的值.
And how does reverse know that the redirect should include monitor/ as well?
这是因为它知道哪些URL可用,1)它知道定义了abc的视图的位置,2)它知道monitor.urls包含在monitor / in中.
What if I had in the main urls.py another app called “xyz” which also has a “abc” view?
在这种情况下,你必须使用namespaces.
标签:python,django,django-views,django-urls 来源: https://codeday.me/bug/20191008/1872357.html