2014-08-27 88 views
2

说我有一个URL设置像这样在我的Django 1.6项目:重定向到包含网址,RedirectView的

urlpatterns = patterns('', 
    url(r'^some-path/', include('someapp.urls')), 
    url(r'^$', RedirectView.as_view(url='some-path/', permanent=False)), 
) 

...但我想改变“一些路径”,以“改变路径”,而是和在这个过程中意识到我已经在一个额外的地方硬编码:RedirectView设置!

有没有适当的方式来做这样的事情,扭转到一个包含的网址捆绑?所有的

# NOT WORKING! Django ignores `name=` when using `include()` 
urlpatterns = patterns('', 
    url(r'^changed-path/', include('someapp.urls'), name='foo'), 
    url(r'^$', RedirectView.as_view(pattern_name='foo', permanent=False)), 
) 

回答

3

首先,你必须去从someapp您urls.py文件,你的基础URL的名称。 让我们假设它是这样的:

# someapp/urls.py 
urlpatterns = patterns(
    'someapp.views', 
    url(r'^$', 'your view', name='foo'), 
    ... 
) 
在主网址,文件

而现在,你可以写的一切是这样的:

# WORKING! Because Django likes namespaces 
urlpatterns = patterns('', 
    url(r'^changed-path/', include('someapp.urls', namespace='bar')), 
    url(r'^$', RedirectView.as_view(pattern_name='bar:foo', permanent=False)), 
) 
+0

谢谢;我特别欣赏命名空间示例。不幸的是,这也是我害怕的 - 在重复自己(如我的问题)或者必须将父逻辑与孩子的内部细节(如在答案中)绑定之间似乎是一个不好的选择。我认为你的后一种方式可能会更好,因为无论何时我构建URL,我都需要知道跨应用的名称。 – natevw 2014-08-29 17:31:06