Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在URLConf中定义嵌套的名称空间,以反转Django URL——有人有可信的例子吗?_Python_Django_Namespaces_Url Mapping_Urlconf - Fatal编程技术网

Python 在URLConf中定义嵌套的名称空间,以反转Django URL——有人有可信的例子吗?

Python 在URLConf中定义嵌套的名称空间,以反转Django URL——有人有可信的例子吗?,python,django,namespaces,url-mapping,urlconf,Python,Django,Namespaces,Url Mapping,Urlconf,我一直在试图弄清楚如何在Django URLConf中定义嵌套的URL名称空间(看起来像这样) 在此之前,我了解了如何创建一个基本的URL名称空间,并提出了一个新的名称空间,其中包含了可以放入urls.py文件中的内容: from django.conf.urls import patterns, include, url # you can only define a namespace for urls when calling include(): app_patterns = pat

我一直在试图弄清楚如何在Django URLConf中定义嵌套的URL名称空间(看起来像这样)

在此之前,我了解了如何创建一个基本的URL名称空间,并提出了一个新的名称空间,其中包含了可以放入
urls.py
文件中的内容:

from django.conf.urls import patterns, include, url

# you can only define a namespace for urls when calling include():

app_patterns = patterns('',
    url(r'^(?P<pk>[\w\-]+)/$', 'yourapp.views.your_view_function',
        name="your-view"),
)

urlpatterns = patterns('',
    url(r'^view-function/', include(app_patterns,
        namespace='yournamespace', app_name='yourapp')),
)

"""

    You can now use the namespace when you refer to the view, e.g. a call
    to `reverse()`:

    # yourapp/models.py

    from django.core.urlresolvers import reverse

    # ...

    class MyModel(models.Model):

        def get_absolute_url(self):
            return reverse('signalqueue:exception-log-entry', kwargs=dict(pk=self.pk))

"""
从django.conf.url导入模式,包括,url
#调用include()时,只能为URL定义命名空间:
应用程序模式=模式(“”,
url(r'^(?P[\w\-]+)/$,“yourapp.views.your_view_函数”,
name=“您的观点”),
)
urlpatterns=模式(“”,
url(r“^view function/”,包括(应用程序模式,
名称空间='yournamespace',app_name='yourapp')),
)
"""
您现在可以在引用视图时使用名称空间,例如调用
要“反转()”:
#yourapp/models.py
从django.core.urlResolver反向导入
# ...
类MyModel(models.Model):
def get_绝对_url(自身):
返回反向('signalqueue:exception log entry',kwargs=dict(pk=self.pk))
"""
。。。w/r/t在这种情况下,其扣减毫无帮助。虽然Django的doc在所有其他方面都很棒,这是一个例外,但是关于定义嵌套URL名称空间的信息就更少了

## urls.py
nested2 = patterns('',
   url(r'^index/$', 'index', name='index'),
)

nested1 = patterns('',
   url(r'^nested2/', include(nested2, namespace="nested2"),
   url(r'^index/$', 'index', name='index'),
)   

urlpatterns = patterns('',
   (r'^nested1/', include(nested1, namespace="nested1"),
)

reverse('nested1:nested2:index') # should output /nested1/nested2/index/
reverse('nested1:index') # should output /nested1/index/
我想我可以问问是否有人拥有或知道一个直接可信和/或自解释的URLconf示例,该示例定义了一个嵌套的名称空间,他们可以共享,而不是发布我的无意识尝试†来解决这个问题

具体来说,我对视图前面的嵌套部分感到好奇:它们是否都需要安装Django应用程序


†)对于好奇的人,这里有一个(可能有点难以理解)示例:。我试图让URL在底部以红色和绿色打印出来,命名为
testapp:views:
,而不是仅仅
testapp:

,它的工作相当直观
include
urlconf如果还有另一个名称空间
include
将产生嵌套的名称空间

## urls.py
nested2 = patterns('',
   url(r'^index/$', 'index', name='index'),
)

nested1 = patterns('',
   url(r'^nested2/', include(nested2, namespace="nested2"),
   url(r'^index/$', 'index', name='index'),
)   

urlpatterns = patterns('',
   (r'^nested1/', include(nested1, namespace="nested1"),
)

reverse('nested1:nested2:index') # should output /nested1/nested2/index/
reverse('nested1:index') # should output /nested1/index/
这是一个保持URL有序的好方法。我想我能给出的最好的建议是记住,
include
可以直接获取一个
patterns
对象(如我的示例),它允许您使用单个
url.py
并将视图拆分为有用的名称空间,而无需创建多个URL文件。

UPDATE 2(2019-10-09) 正如eugene所评论的那样,更新1不再适用于Django的最新版本,后者需要在
url.py
中定义
app_名称

myproject
)和几个应用程序(
products
books
)演示如何创建嵌套的命名空间。总之,各种
url.py
如下所示:

#myproject/url.py
从django.url导入包括,路径
从产品导入URL作为产品\u URL
从产品导入视图
URL模式=[
路径(“,views.site_home,name=“home”),
路径(“products/”,包括(products\u url,namespace=“products”),)
]
#产品/url.py
从django.url导入包括,路径
从书籍导入URL作为书籍\u URL
从…起导入视图
app_name=“产品”
URL模式=[
路径(“,views.index,name=“product_index”),
路径(“books/”,包括(books\u url,namespace=“books”),
]
#books/url.py
从django.url导入路径
从…起导入视图
app_name=“书籍”
URL模式=[
路径(“,views.index,name=“book_index”),
路径(“/”,views.detail,name=“book\u detail”),
]
因此,您可以像这样使用这些嵌套URL名称:

反向(“产品:图书:图书索引”)
#“/产品/书籍/”
反向(“产品:书籍:书籍细节”,kwargs={“书籍片段”:“我的书”})
#“/产品/书籍/我的书”

更新1 Django 2.0引入了两个相关的更改。首先,
urls()
函数现在位于
django.urls
,因此上面的
urls.py
示例的第一行是:

从django.url导入包括,url
其次,它引入了
path()
函数,作为不需要正则表达式的路径的更简单的替代方法。使用该方法,示例
urls.py
如下所示:

从django.url导入包括,路径
嵌套2=[
路径('index/','index',name='index'),
]   
嵌套1=[
路径('nested2/',include(nested2,namespace='nested2')),
路径('index/','index',name='index'),
]   
URL模式=[
路径('nested1/',include(nested1,namespace='nested1')),
]

原始答案 虽然Yuji的答案是正确的,但请注意,
django.conf.urls.patterns
不再存在(自django 1.10以来),而是使用普通列表

同样的示例
url.py
现在应该是这样的:

从django.conf.url导入包括,url
嵌套2=[
url(r“^index/$”,“index”,name='index'),
]   
嵌套1=[
url(r“^nested2/”,包括(nested2,namespace='nested2')),
url(r“^index/$”,“index”,name='index'),
]   
URL模式=[
url(r“^nested1/”,包括(nested1,namespace='nested1')),
]   
并且仍然像这样使用:

reverse('nested1:nested2:index')#应该输出/nested1/nested2/index/
反向('nested1:index')#应输出/nested1/index/

Nice,这确实很简单。谢谢
urlpatterns
变量不应该也有
url
函数调用吗?对于django2+,有一个错误
“配置不当:不支持在include()中指定名称空间而不提供应用程序名称”
遇到了同样的配置不当问题,并且最初被文档弄糊涂了。为这些包含项命名的方法似乎是使用元组,例如,
nested2=([path(…)],'nested2')
,否则省略
名称空间。