将实例名称空间视为您的昵称,将应用程序名称空间视为您的真实姓名。
人们可以给你很多昵称,但你的真名不会改变。
Django 使用应用程序命名空间(你的真实姓名)来反转 url,因为作为一个应用程序你不应该关心有多少实例命名空间(昵称)。
但是为了区分一个实例和下一个实例,您将在 urlconfs 中使用实例命名空间(昵称)。
假设您的应用与客户和商店员工打交道。这两个都有物理地址,您可能希望使用只处理所有地址信息的应用程序:表单、验证、模型结构、地理位置等。我们虚构的应用程序是一个名为“django_super_address”的可重复使用的 django 应用程序。
您的根 url conf 可能如下所示:
urlpatterns = [
path('customer/address/',
include('django_super_address.urls',
namespace='customer_address')
),
path('employee/address/',
include('django_super_address.urls',
namespace='employee_address')
),
]
这包括不同 URL 路径下的相同 url,指向同一个应用,使用不同的命名空间(昵称)。
在django_super_address 中,它定义了它的应用程序命名空间:
# File: django_super_address/urls.py
from . import views
app_name = 'django_super_address'
urlpatterns = [
path('create/', views.SomeAddressCreateView.as_view(),
name='address_create'),
path('create/success/', views.SuccessView(),
name='address_create_success'),
...
]
在它使用的视图中:
# File django_super_address/views.py
class SomeAddressCreateView(generic.CreateView):
def success_url(self):
return reverse(
'django_super_address:address_create_success'
)
...
当 Django 获取 URL `/employee/address/create/' 时:
- 它将实例命名空间设置为
employee_address
- 它从
django_super_address读取url
- 它将应用程序命名空间设置为
django_super_address 和
将 urls.py 与该应用程序命名空间相关联。
在视图中:
- 它通过查看与应用程序命名空间(真实名称)关联的 urls 文件来反转 URL,并将名称反转为:
create/success
- 然后它返回到链上,现在使用实例命名空间(昵称)来添加 URL 的其余部分:
root + employee/address/ + create/success/ = /employee/address/create/success/
你有它:urlconfs的昵称和reverse的应用程序命名空间!