Python 理解django.shortcuts.redirect

Python 理解django.shortcuts.redirect,python,django,django-views,django-urls,Python,Django,Django Views,Django Urls,我在理解重定向或者更确切地说反向如何真正工作时遇到了一些问题 在main url.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'

我在理解
重定向
或者更确切地说
反向
如何真正工作时遇到了一些问题

在main url.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.url
中,我有:

from django.conf.urls import patterns, include, url 

urlpatterns = patterns('monitor.views',
        (r'^$', 'index'),
        (r'^abc/(?P<id>.*$)', 'abc'),
)   
但我得到了一个
NoReverseMatch
异常。但当我这样做的时候:

def index(request):
    return redirect("abc/")
然后它突然起作用了

我不能完全理解为什么。为什么
反向
abc
一起失败,而与
abc/
一起失败?
reverse
如何知道重定向也应该包括
monitor/
?如果我在main urls.py中有另一个名为
xyz
的应用程序,它也有一个
abc
视图,该怎么办

为什么使用“abc”而不使用“abc/”时反向失败

因为它将其解释为一个视图名称(而且您确实有一个名为
'abc'
,请参阅您的
monitor.url
文件的视图)。这意味着Django将调用
reverse
来计算URL。值
abc/
被解释为实际的URL,这意味着Django不会调用
reverse
来确定URL

这也解释了为什么
reverse
失败:名为
abc
的视图还需要名为
id
的参数。否则Django将无法查找URL,因为没有名为
abc
的视图没有参数

基于此,您应该能够使用以下方法反转URL:

redirect("abc", id=...)
其中,
id
参数的值

reverse如何知道重定向还应该包括monitor/呢

这是因为它知道哪些URL可用,1)它知道名为
abc
的视图的定义位置,2)它知道
监视器。URL
包含在前面的
监视器中

如果我在主URL.py中有另一个名为“xyz”的应用程序,它也有一个“abc”视图,该怎么办


在这种情况下,您必须使用。

谢谢您的重播。但是当我返回重定向('abc',id=8)
时,我仍然得到一个NoReverseMatch。错误消息是“未找到参数为“()”且关键字参数为“{id':8}”的'abc'的反转”。是否应将请求元素包含在某个位置?当我执行
返回重定向(abc,id=8)
时,它也起作用。我仍然有些困惑:(
redirect("abc", id=...)