为什么在包含另一个URLconf时,你只能传递一个`app_name`关键字arg?

时间:2016-07-27 17:52:42

标签: django

在Django应用的标准urls.py中,如果我将app_name没有namespace传递到include()来电,如下所示:

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

当点击其中一个包含的网址时,我收到如下错误。

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 个答案:

答案 0 :(得分:5)

如果您在包含功能中使用命名空间属性,则必须在应用 urls.py <中定义 app_name / strong>您正在使用的文件。 &GT; Django 2.0 URL dispatcher documentation
例如,如果这是您的项目结构:

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

如果你想包含(app1,app2)网址,首先必须在app1 / urls.py和app2 / urls.py中定义 app_name

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' %}

答案 1 :(得分:0)

你需要把:app_name放在&#34; foo.urls&#34;

link:https://docs.djangoproject.com/en/2.0/topics/http/urls/#url-namespaces-and-included-urlconfs