当包含另一个URLconf时,为什么不能仅传递`app_name`关键字arg?

Jam*_*iew 4 django

在标准的urls.py一个Django应用程序的,如果我通过一个app_name没有namespaceinclude()呼叫,象下面这样:

urlpatterns = [
    # ...
    url(r'^', include('foo.urls', app_name='foo')),
    # ...
]
Run Code Online (Sandbox Code Playgroud)

击中包含的网址之一时,出现如下错误。

ValueError: Must specify a namespace if specifying app_name.

因此有必要做:

urlpatterns = [
    # ...
    url(r'^', include('foo.urls', namespace='foo-urls', app_name='foo')),
    # ...
]
Run Code Online (Sandbox Code Playgroud)

我看不到两者之间的硬性依赖。为什么必须指定一个namespace以便能够指定一个app_name

小智 6

如果在include函数中使用namespace属性,则必须在使用的应用程序urls.py文件中定义app_name。> Django 2.0 URL调度程序文档 例如,如果这是您的项目结构:

project/
??? app1
?   ??? urls.py
??? app2
?   ??? urls.py
??? project
    ??? urls.py
Run Code Online (Sandbox Code Playgroud)

并且要包含(app1,app2)URL,首先必须在app1 / urls.py和app2 / urls.py中定义app_name

file: app1/urls.py

app_name='app1'
urlpatterns = [  
    path('', views.home, name='home'),
]
Run Code Online (Sandbox Code Playgroud)

file: app2/urls.py

app_name='app2'
urlpatterns = [  
    path('', views.home, name='home'),
]
Run Code Online (Sandbox Code Playgroud)

file: project/urls.py

urlpatterns = [  
    path('', include('app1.urls', namespace='app1')),
    path('', include('app2.urls', namespace='app2')),
]
Run Code Online (Sandbox Code Playgroud)

所以,你现在可以使用这样的事情{% url 'app1:home' %}还是{% url 'app2:home' %}在你的模板文件。