【问题标题】:What's the point of using namespace inside include? (Django 2.0)在 include 中使用命名空间有什么意义? (Django 2.0)
【发布时间】:2018-12-29 04:11:50
【问题描述】:

如果在应用程序的 url 中添加 app_name 是真正让我使用“app:view”语法的方法,那么在 include 中使用命名空间有什么意义。

Blog_app/urls.py

​​>
from django.urls import path
    from django.views.generic.base import RedirectView
    from . import views

    app_name = 'posts'  #APP_NAME

    urlpatterns = [
           path('',RedirectView.as_view(url='posts/'), name='home'),
           path('posts/',views.post_list, name='list'),
           path('posts/detail/<int:pk>',views.post_detail, name='detail'),
           path('posts/delete',views.post_delete, name='delete'),
           path('posts/create',views.post_create, name='create'),
           path('posts/update',views.post_update, name='update'),]

项目/urls.py

​​>
from django.contrib import admin
from django.urls import path,include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include('blog_app.urls',namespace='posts')),]

此代码用于将 url 反转为这样的帖子/详细信息

example.html

<a href="{% url 'posts:list' %}"> Example <a/>

但如果删除命名空间,它仍然会将我的网址反转为帖子/详细信息

项目/urls.py

​​>
from django.contrib import admin
from django.urls import path,include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include('blog_app.urls')), #NAMESPACE DELETED

]

【问题讨论】:

  • 因为您可以拥有单个应用的多个实例。

标签: python django django-templates django-views


【解决方案1】:

正如 Django 网站所说:

URL 命名空间允许您唯一地反转命名的 URL 模式,甚至 如果不同的应用程序使用相同的 URL 名称。这是一个很好的做法 第三方应用程序始终使用命名空间 URL(就像我们在 教程)。同样,如果有多个 URL,它还允许您反转 URL 部署应用程序的实例。换句话说,由于 单个应用程序的多个实例将共享命名 URL, 命名空间提供了一种区分这些命名 URL 的方法。

https://docs.djangoproject.com/en/2.0/topics/http/urls/#url-namespaces

【讨论】:

    【解决方案2】:

    Blog_app/urls.py 中的应用名称 app_name = 'posts' 用作 url 命名空间。如果你删除它,你会得到一个命名空间错误。您可以在include 中分配另一个命名空间,两者都可以用作 url 命名空间。

    【讨论】:

    • 我仍然没有完全理解。请告诉我我是否正确。如果我将命名空间设置在include 中而不是app_name 中,我会收到错误...所以我必须写app_name 才能为我的应用程序使用命名空间,如果我想要两个命名空间,我可以放另一个在include?像这样: include('app.urls',namespace='app1') 和 app_name = 'app2' 我可以选择 {% url 'app1:view' %} 还是 {% url app2:view %} ?你是这个意思吗?
    • 你是对的。您必须始终分配 app_name,然后您可以在包含中分配另一个命名空间,然后您可以在模板中使用任一名称。删除 app_name 将导致此错误不支持在 include() 中指定命名空间而不提供 app_name。
    猜你喜欢
    • 2010-10-05
    • 2012-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-10
    • 2017-05-27
    相关资源
    最近更新 更多