我几乎有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
模式。
在namespace
中使用include()
允许您多次包含相同的应用程序,每个实例具有不同的命名空间。
您可以看到一个示例in the docs,其中polls
应用程序包含两次,具有两个不同的命名空间。
如果您只在项目中包含route.urls
一次,那么namespace='route'
不是必需的,可以删除。
使用命名空间,您可以在模板中执行此操作:
<a href="{% url 'portal:changepass' %}">Change pass</a>
如果在其他应用程序中有另一个名称为“changepass”的URL,则可以仅更改名称空间:
<a href="{% url 'system:changepass' %}">Change pass</a>
我希望它能帮助^^