当include()
将Django应用的urlconf文件传输到项目的urls.py
时,应用的名称(或命名空间)应该指定为:
app_namespace
在include((pattern_list, app_namespace), namespace=None)
中在主urls.py
中
或
- 应用程序的
urls.py
中的app_name
变量。
因为,我猜,Django 2,第二种方法是首选的。虽然我复制粘贴了Django 3文档中的第一个函数签名,但这不是重点。
我目前对include()
的namespace
参数的理解是,它是我在使用reverse()
时使用的参数。
应用的urls.py
中的app_name
或主urls.py
中的app_namespace
的用途是什么?
这是一回事吗?
Django是如何使用它的?
我在这里找到的现有问题(和答案)解释了我应该如何指定它,而不是为什么。
4条答案
按热度按时间pvcm50d11#
在这个答案中,我使用了DRF package和它的URL patterns。如果你想尝试这个答案中提到的任何代码片段,你必须安装(
pip install djangorestframework
)并将rest_framework
添加到INSTALLED_APPS
列表中。***应用程序命名空间***可通过两种方式设置,[参考:Django文档]
1.在
urls.py
中使用app_name
变量。你可以看到DRF已经在
urls.py
中设置了app_name
。只有当我们包含了带有***模块引用的模式时,Django才会使用这个app_name
作为 * 应用程序名称空间 。即
include(module, namespace=None)
1.在
include((pattern_list, app_namespace), namespace=None)
函数中使用app_namespace
参数。在此方法中,如果需要,可以为应用程序设置一个 * 附加
app_namespace
。最重要的是,我们传递的是pattern_list*而不是 * module *
完整示例
1.应用的
urls.py
中的app_name
或主urls.py
中的app_namespace
的用途是什么?两者都用于设置***应用程序命名空间***。如果在
urls.py
中定义,则app_name
可用作***默认应用程序命名空间***。1.这是一回事吗?
没有。
***应用程序命名空间***和***示例命名空间*用于获取URL路径。在Django中,每当执行
reverse(...)
**函数时,Django会首先查找应用程序命名空间。您可以在此处阅读更多关于Django如何解析URL的信息,反转命名空间URLaurhwmvo2#
app/www.example.com中的
app_name
和main urls.py中的include((pattern_list, app_namespace), namespace=None)
中的app_namespace
与描述正在部署的应用程序名称的应用程序命名空间引用相同。urls.py andapp_namespace
ininclude((pattern_list, app_namespace), namespace=None)
in main urls.py are the same referenced as application namespace which describes the name of the application that is being deployed.可以将整个app/www.example.com或对app/urls.py的字符串引用(带有app_name)传递给
include()
urls.py or a string reference of app/urls.py with app_name toinclude()
或
将url模式和app_namespace的元组转换为
include()
如果
include()
中提供了app_namespace
,则app_namespace
将是默认的应用程序命名空间。如果未提供app_namespace
,则它将在blog/urls.py
中查找app_name
,并将其作为默认命名空间。如果没有应用命名空间,URL将添加到全局命名空间,这可能会导致URL冲突。
URL命名空间和包含的URLconf|术语应用程序命名空间|包括()
ncgqoxb03#
多年来,我们(在Django)一直在回避应用程序名称(空格)和示例名称空间之间的(令人困惑的)区别。我们总是建议使用示例名称空间,就像文档中的例子一样。
Django2.0(及以后版本)的情况是,如果不使用应用程序名称,就不能使用示例名称空间。我们不应该修改代码,而应该更新我们的示例以正确使用。
include需要如下所示:
现在的趋势是也包含第二个
namespace='pikachu'
示例名称空间参数,但这不是必需的--它默认为None,在本例中自动设置为'pikachu'
。一般来说,用户希望包含一个应用程序级URL模块,在其中显式设置
app_name
属性,而不是手动包含路由器。hwamh0ep4#
来自https://docs.djangoproject.com/en/3.0/topics/http/urls/#introduction:
即使不同的应用程序使用相同的URL名称,URL命名空间也允许您唯一地反转命名的URL模式。第三方应用程序始终使用命名空间URL是一个很好的做法(就像我们在教程中所做的那样)。类似地,如果部署了应用程序的多个示例,它还允许您反转URL。换句话说,由于单个应用程序的多个示例将共享命名URL,名称空间提供了区分这些命名URL的方法。