Python 在URLConf中定义嵌套的名称空间,以反转Django URL——有人有可信的例子吗?
我一直在试图弄清楚如何在Django URLConf中定义嵌套的URL名称空间(看起来像这样) 在此之前,我了解了如何创建一个基本的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
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')
,否则省略名称空间。