小编典典

了解django.shortcuts.redirect

python

我有几个问题,如何理解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怎么办?


阅读 216

收藏
2021-01-20

共1个答案

小编典典

为什么反向失败的原因是“ 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”视图,该怎么办?

在这种情况下,您必须使用名称空间

2021-01-20