Django 2.1 - namespace = do在urls.py中的include上做了什么

问题描述 投票:0回答:2

我几乎有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模式。

python django
2个回答
1
投票

namespace中使用include()允许您多次包含相同的应用程序,每个实例具有不同的命名空间。

您可以看到一个示例in the docs,其中polls应用程序包含两次,具有两个不同的命名空间。

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


0
投票

使用命名空间,您可以在模板中执行此操作:

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

如果在其他应用程序中有另一个名称为“changepass”的URL,则可以仅更改名称空间:

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

我希望它能帮助^^

© www.soinside.com 2019 - 2024. All rights reserved.