我的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
模式。
答案 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>
我希望这会有所帮助^^