我的应用程序的 url 配置当前如下所示:
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 时,这可以正常工作。
现在,我想将我的应用程序的网址包含到项目的网址配置中,并带有前缀;像这样:
urlpatterns = patterns("",
(r"^myapp/", include("myapp.urls")),
)
但是 http://myserver.org/myapp/
不会重定向到 http://myserver.org/myapp/main/
,而是 http://myserver.org/main/
。
我想我明白它是如何工作的:项目的 url 模式得到 "myapp/"
。这匹配前缀,它被剥离,留下 ""
,它被传递给应用程序的模式。该应用程序不知道剥离,只是重定向到 main/
,Django 将其解释为 ,这不适用于更深的嵌套网址(请参阅下面的编辑)。/main/
如何告诉 Django 重定向到与应用程序前缀相关的 URL?
编辑:错误!
啊!上面的代码工作正常,但我的浏览器将永久重定向缓存到以前的 url,即 "/main/"
。我清除了我的缓存和我的新 url "main/"
(现在是临时的以防止缓存)工作正常。对不起!
但我意识到,当我想从更深的嵌套转到相对于应用程序根目录的 url 时,答案会很有帮助:"relative/"
可能适用于 http://myserver.org/myapp/foo/
,但不适用于 http://myserver.org/myapp/foo/bar/
。
最佳答案
在 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()
解析为与作为参数提供给 reverse_lazy()
的“name”参数相同的字符串的 URL。
如果您使用的是早期版本,则必须指定完整路径,这当然违反了 DRY 原则:
(r"^$", redirect_to, {"url": "myapp/title/"}),
关于python - Django 中的相对重定向,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7568000/