2016-07-27 44 views
3

在Django應用程序的標準urls.py,如果我通過一個app_name沒有namespaceinclude()呼叫,象下面這樣:爲什麼在包含另一個URLconf時不能傳遞`app_name`關鍵字arg?

urlpatterns = [ 
    # ... 
    url(r'^', include('foo.urls', app_name='foo')), 
    # ... 
] 

我得到一個錯誤,如擊中包含一個URL時以下。

ValueError: Must specify a namespace if specifying app_name.

所以有必要做的事:

urlpatterns = [ 
    # ... 
    url(r'^', include('foo.urls', namespace='foo-urls', app_name='foo')), 
    # ... 
] 

我看不出兩者之間的硬依賴;爲什麼有必要指定namespace以便能夠指定app_name

+2

嗯,聽起來像Django的官方文檔有所有的答案:https://docs.djangoproject.com/en/1.9/topics/http/urls/#url-namespaces –

+1

請參閱[#17716](https:// code.djangoproject.com/ticket/17716)。另請注意,不推薦使用'app_name'參數。在1.9+中,你應該在'foo.urls'中設置一個'app_name'屬性,它不需要你設置'namespace'參數。你所看到的錯誤大多是它過去如何工作的人爲因素,而且無論如何也不會改變它。 – knbk

+0

@knbk有道理,我應該提到我正在使用Django 1.8(.12)@ shang-wang我沒有看到明確的解釋。想要只使用'app_name'的原因是我有一個第三方庫,我懷疑是通過給它一個「命名空間」(默認情況下它沒有一個),所以它將是有用的附加一個'app_name'到它的URL,這將過濾來自該庫的'ResolverMatch'對象更容易。雖然從再次閱讀文檔,我的理解是'app_name'就像是一個「默認命名空間」,所以它可能無法達到我想要的效果 –

回答

4

如果您使用的是命名空間屬性在包括功能,您必須在定義APP_NAME應用程序您正在使用的urls.py文件。 >Django 2.0 URL dispatcher documentation
舉例來說,如果這是你的項目結構:

project/ 
├── app1 
│   └── urls.py 
├── app2 
│   └── urls.py 
└── project 
    └── urls.py 

而且要包括(應用,應用2)的網址,你首先必須定義APP_NAME在APP1/urls.py和App2 /urls.py:

file: app1/urls.py

app_name='app1' 
urlpatterns = [ 
    path('', views.home, name='home'), 
] 

file: app2/urls.py

app_name='app2' 
urlpatterns = [ 
    path('', views.home, name='home'), 
] 

file: project/urls.py

urlpatterns = [ 
    path('', include('app1.urls', namespace='app1')), 
    path('', include('app2.urls', namespace='app2')), 
] 

所以,你現在可以使用這樣的事情{% url 'app1:home' %}{% url 'app2:home' %}在模板文件。

相關問題