Django 2.1-namespace =对urls.py中的include做了什么

时间:2019-04-23 13:54:33

标签: python django

我的app_name和名称空间运行良好,但是我有一个简单的说明-我认为这可能是我的2.1 Django中的某些内容,在早期Django版本中可能有所不同。

我有一个名为route的应用,在它的urls.py中有:

app_name = 'route'  
urlpatterns = [
    path('first', views.FirstView.as_view(), name='first-view'),
]

在我的views.py和模板文件中,我在route:first-view调用和reverse()调用中使用{% url .. %},一切正常。

我的困惑是在我的整个项目urls.py中,我这样说:

urlpatterns = [
    path('route/', include('route.urls', namespace='route')),
]

让我发疯的部分是,看来namespace=参数根本没有任何作用。如果我忽略了代码,或者即使我说namespace='abc',我的代码也一样工作-Django 2.1似乎100%忽略了它。

如果我在未设置namespace='route'的情况下使用app_name,也会收到错误消息:Specifying a namespace in include() without providing an app_name is not supported

如果namespace=被忽略-那么我很高兴设置app_name-我将其保留-似乎它必须具有我无法弄清楚的目的。也许这是不必要的,并且来自早期版本的Django。

注意:我看过a similar question and answer,但是该示例并未说明使用path时名称空间的工作方式。我尝试避免使用url /正则表达式模式,并尽可能使用更简单的path模式。

2 个答案:

答案 0 :(得分:1)

namespace中使用include()可让您多次包含 same 应用程序,并为每个实例使用不同的命名空间。

您可以看到示例in the docs,其中polls应用被两次包含了两个不同的名称空间。

如果您仅在项目中包含一次route.urls,则namespace='route'不是必需的,可以删除。

答案 1 :(得分:0)

有了命名空间,您可以在模板中执行以下操作:

<a href="{% url 'portal:changepass' %}">Change pass</a>

如果另一个应用程序中有另一个具有相同名称“ changepass”的网址,则可以仅更改名称空间来执行相同的操作:

<a href="{% url 'system:changepass' %}">Change pass</a>

我希望这会有所帮助^^