编程语言
首页 > 编程语言> > python – 了解django.shortcuts.redirect

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