Django中的相对重定向

时间:2011-09-27 10:59:21

标签: python django http redirect

我的应用的网址配置目前如下:

from django.conf.urls.defaults import patterns
from django.views.generic.simple import redirect_to

urlpatterns = patterns("myapp.views",
    (r"^$", redirect_to, {"url": "main/"}),
    (r"^(?P<title>.+)/$", "article"),
    ...
)

当使用没有前缀的应用程序网址时,此方法正常。

现在,我想将我的应用程序的url包含在带有前缀的项目的url配置中;像这样:

urlpatterns = patterns("",
    (r"^myapp/", include("myapp.urls")),
)

但后来http://myserver.org/myapp/未重定向到http://myserver.org/myapp/main/,而是重定向到http://myserver.org/main/

我想我理解它是如何工作的:项目的网址模式得到"myapp/"。这与前缀相匹配,前缀被删除,留下"",传递给应用程序的模式。该应用程序与剥离无关,只是重定向到main/,Django将其解释为/main/ ,这对于更深层的嵌套URL无效(参见下面的编辑)。 p>

如何告诉Django重定向到相对于应用程序前缀的URL?


编辑:错误!

啊哈!上面的代码工作正常,但我的浏览器缓存了永久重定向到上一个网址,即"/main/"。我清除了我的缓存和我的新网址"main/"(现在现在是暂时的,以防止缓存)工作正常。遗憾!

但是我意识到当我想从更深的嵌套中找到相对于应用程序根目录的网址时,答案会有所帮助:"relative/"可能适用于http://myserver.org/myapp/foo/,但不适用于{{1} }}

1 个答案:

答案 0 :(得分:2)

在django 1.4中,您将能够使用函数reverse_lazy()

from django.core.urlresolvers import reverse_lazy
urlpatterns = patterns("myapp.views",
    (r"^$", redirect_to, {"url": reverse_lazy("myapp_title")}),
    (r"^(?P<title>.+)/$", "article", name="myapp_title"),
    ...
)

reverse_lazy()解析为URL,该URL与“name”参数具有相同的字符串,该参数作为reverse_lazy()的参数提供。

如果您使用的是早期版本,则必须指定完整路径,当然这违反了DRY原则:

(r"^$", redirect_to, {"url": "myapp/title/"}),