我指的是https://www.webforefront.com/django/namedjangourls.html来理解django urlconfs。我遇到过术语实例命名空间和应用程序命我知道urlsconfs中的命名空间。但我不知道它们之间的区别。
我提到了django docs。它提到在django项目中使用相同应用程序的多个实例时,实例和应用程序命名空间就会出现。
但是,我仍然无法理解它。我已经google了,但无法找到任何帮助。
提前致谢。
答案 0 :(得分:5)
将实例名称空间作为您的昵称,将应用程序名称空间作为您的真实名称。
人们可以为您提供多个昵称,但您的真实姓名不会改变。
Django使用应用程序名称空间(您的真实姓名)来反转url,因为作为应用程序,您不必在意有多少实例名称空间(昵称)。
但是要区分一个实例和另一个实例,您将在urlconfs中使用实例名称空间(昵称)。
假设您的应用与客户和商店员工打交道。这两个都有物理地址,您可能要使用一个只处理所有地址信息的应用程序:表单,验证,模型结构,地理位置等。我们的虚构应用程序是可重用的django应用程序,称为“ django_super_address”。
您的根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 /'时:
customer_address
django_super_address
读取网址django_super_address
并
将urls.py与该应用程序名称空间相关联。在视图中:
create/success
root
+ employee/address/
+ create/success/
= /employee/address/create/success/
就可以了:urlconfs的昵称和反向的应用程序名称空间!
答案 1 :(得分:0)
据我了解,它是这样的:
实例名称空间的应用听起来可能有些混乱。让我尝试澄清是否是这种情况。考虑一下Django docs中给出的示例。
urls.py:
from django.urls import include, path
urlpatterns = [
path('author-polls/', include('polls.urls', namespace='author-polls')),
path('publisher-polls/', include('polls.urls', namespace='publisher-polls')),
]
polls / urls.py:
from django.urls import path
from . import views
app_name = 'polls'
urlpatterns = [
path('', views.IndexView.as_view(), name='index'),
path('<int:pk>/', views.DetailView.as_view(), name='detail'),
...
]
命名空间的定义如下:
app_name
属性定义
namespace
参数定义
此处,author-polls
和publisher-polls
都使用相同的polls.urls
来解析其URL。如果没有实例名称空间,则解析'polls:index'之类的URL可能会导致混淆其打算获取的URL。这就是为什么Django定义了一组protocol来解决各种情况下试图反转和解析命名空间URL时此问题的原因。
答案 2 :(得分:0)
您可以将urls.py用于应用程序,方法是将其包含在不同的urls路径中,例如,我们可以:
urlpatterns = [
path('author-polls/', include('polls.urls')),
path('publisher-polls/', include('polls.urls')),
]
如您所见,两个都包含polls.urls,
app_name = 'polls' urlpatterns = [
path('', views.IndexView.as_view(), name='index'),
path('<int:pk>/', views.DetailView.as_view(), name='detail'),
...
]
到目前为止一切顺利!
但是有一个问题。在模板中,“ polls:index”指向哪里? 现在,实例名称空间出现了。
urlpatterns = [
path('author-polls/', include('polls.urls', namespace='author-polls')),
path('publisher-polls/', include('polls.urls', namespace='publisher-polls')),
]
Django有一些逆向命名空间网址的规则>> https://docs.djangoproject.com/en/3.0/topics/http/urls/#reversing-namespaced-urls