示例名称空间和应用名称空间在django url中有什么区别?

6yjfywim  于 2023-01-27  发布在  Go
关注(0)|答案(5)|浏览(138)

我引用https://www.webforefront.com/django/namedjangourls.html来理解django urlconfs,我遇到过示例名称空间和应用程序名称空间,我知道urlsconfs中的名称空间,但我不知道它们之间的区别。
我参考了django文档,它提到了示例和应用命名空间,当同一个应用的多个示例在django项目中使用时,就会出现这种情况。
但是我还是不明白,我已经在谷歌上搜索过了,但是没有找到任何帮助。
先谢了。

rjjhvcjd

rjjhvcjd1#

将示例名称空间视为昵称,将应用程序名称空间视为真名。
人们可以给你起很多绰号,但你的真名不会变。
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/'时:
1.它将示例名称空间设置为employee_address
1.它从django_super_address读取url
1.它将应用程序命名空间设置为django_super_address,并将www.example.com与该应用程序命名空间相关联。 urls.py with that application namespace.
在视图中:
1.它通过查看与应用程序命名空间(真实名称)关联的urls文件来反转URL,并将名称反转为:create/success
1.然后,它返回到链中,现在使用示例名称空间(昵称)将url的其余部分放在前面:x1米5纳米1 x + x1米6纳米1 x + x1米7纳米1 x = x1米8纳米1 x
现在你知道了:昵称为urlconfs和应用程序命名空间为反向!

t98cgbkg

t98cgbkg2#

据我了解,事情是这样的:

  • 对于使用相同URL模式的两个不同应用程序,请使用应用程序名称空间
  • 对于使用相同URL配置和视图的同一应用程序的两个不同示例,请使用示例名称空间

示例名称空间的应用听起来可能有点混乱。让我试着澄清一下。考虑一下Django文档中给出的例子。
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')),
]

民意调查/www.example.comurls.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'),
...
]

命名空间的定义如下:

      • 应用程序命名空间polls/www.example.com中的app_name属性定义urls.py
      • 示例命名空间urls. py**中的namespace参数定义

在这里,author-pollspublisher-polls都使用相同的polls.urls来解析它们的URL。如果没有示例名称空间,解析像**'polls:index'**这样的URL可能会混淆它要获取的URL。这就是为什么Django定义了一组协议来解决这个问题,以解决当你试图反转和解析名称空间URL时的各种情况。

hs1ihplo

hs1ihplo3#

您可以通过将www.example.com包含在不同的URL路径中来将其用于应用程序,例如,我们可以具有:urls.py for an app by including it in different urls path, for example we can have:

urlpatterns = [
    path('author-polls/', include('polls.urls')),
    path('publisher-polls/', include('polls.urls')), 
]

如您所见,两者都包含polls. url,这是:

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有一些规则来反转名称空间的url〉〉www.example.comhttps://docs.djangoproject.com/en/3.0/topics/http/urls/#reversing-namespaced-urls

bzzcjhmw

bzzcjhmw4#

基本上,每个应用程序命名空间可以具有多个示例命名空间,例如:
这是项目URL文件(主URL):

path('', include("movie_app.urls")),
path('my_namespace1/', include("movie_app.urls", namespace='my_namespace1')),
path('my_namespace2/', include("movie_app.urls", namespace='my_namespace2')),

你可以看到,他们都提到了相同的app. urls文件(movie_app. urls),但路径链接不同。
第一个是:"",
第二个是"我的名称空间1/",
第三是:"我的名称空间2/",
这是movie_app. urls文件(子文件):

app_name = 'movie_app'

urlpatterns = [
    path('appmovie1/', myview1 , name="myname"),   

]

现在当你在你的html模板中使用所有路径时,例如:

<h1><a href="{% url 'movie_app:myname' %}"> application namespace : url name</a></h1>
    <h1><a href="{% url 'my_namespace1:myname' %}">instance namespace1 : url name</a></h1>
    <h1><a href="{% url 'my_namespace2:myname' %}">instance namespace2 : url name </a></h1>

您将注意到href链接中的不同之处:

<h1><a href="/appmovie1/"> application namespace : url name</a></h1>
    <h1><a href="/my_namespace1/appmovie1/">instance namespace1 : url name</a></h1>
    <h1><a href="/my_namespace2/appmovie1/">instance namespace2 : url name </a></h1>

最后:
应用命名空间和示例命名空间将帮助您从使用同一include. urls文件的多个URL路径中确定/选择正确的URL路径。
我希望这对你有帮助。

ugmeyewa

ugmeyewa5#

命名空间示例只能和include一起使用,当我们想要多个路径有不同的URL,但又想包含相同的URLconf模块时,这是很有用的。
假设我们有这样的代码:

#my_site/urls.py
urlpatterns = [
path('url1/',include('english.urls')),
path('url2/',include('english.urls'))]

#english/urls.py
app_name='english'
urlpatterns = [
path('words/', views.index, name='words')]

#template.html
<a href="{% url 'english:words' %}">Something</a>

点击链接会将我们重定向到url1/words,因为Django会从urlpatterns中选择第一个元素。如果我们想被重定向到url2/words,我们必须使用名称空间(示例名称空间),即:

#my_site/urls.py
urlpatterns = [
path('url1/',include('english.urls', namespace='eng')),
path('url2/',include('english.urls', namespace='eng2'))]

#english/urls.py
app_name='english'
urlpatterns = [
path('words/', views.index, name='words')]

然后:

#template.html
<a href="{% url 'eng2:words' %}">Something</a>

我要补充的是,如果我们没有示例名称空间,Django可能会警告我们:
警告:?:(urls.W005)URL命名空间"english"不是唯一的。您可能无法反转此命名空间中的所有URL
通常,示例命名空间在以下情况下很有用,例如:

  • 我们希望根据用户的母语使用不同的URL,例如:"django/文档/"、" django/文档/"或"django/en"、"django/pl"
  • 我们希望为特定人群划分URL:"亚马逊/客户/"、"亚马逊/员工"
  • 我们已经更改了网站的URL,为了不使老用户感到困惑,我们还允许通过前面的链接访问该网站
  • 我们使您更容易在互联网上找到我们的网站

这并不局限于不同的URL,即使我们使用相同的视图,我们也可以根据我们所使用的URL对其进行轻微的修改:

def index(request):
    current_url = request.path
    if current_url == '/url1/words/':
        ''' do something '''
    elif current_url == '/url2/words/': 
        ''' do something else '''
    return render(request, 'template.html')

例如,我们可以更改上下文或选择不同的模板。

相关问题