fis*_*000 17 python django namespaces url-mapping urlconf
我一直试图弄清楚如何look:like:this在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))
"""
Run Code Online (Sandbox Code Playgroud)
... w/r/t Django文档的推导,在这种情况下,根本没有帮助.虽然Django的doc在所有其他方面都很棒,但这是规则的一个例外,关于定义嵌套URL命名空间的信息甚至更少.
我想,如果有人拥有或知道一个直接有说服力和/或不言自明的URLconf定义嵌套命名空间的例子,我可能会问他们可以分享这些尝试.
具体来说,我很好奇视图前缀的嵌套部分:需要它们都安装Django应用程序吗?
†)对于好奇,这是一个(可能有点难以理解)的例子:http://imgur.com/NDn9H.我试图将底部以红色和绿色打印的URL命名为testapp:views:<viewname>而不是仅仅命名testapp:<viewname>.
Yuj*_*ita 27
它的工作非常直观.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/
Run Code Online (Sandbox Code Playgroud)
这是保持网址组织的好方法.我想我能给出的最好建议是记住include可以patterns直接获取对象(如我的例子中所示),它允许您使用单个urls.py视图并将视图拆分为有用的命名空间,而无需创建多个URL文件.
虽然Yuji的答案是正确的,但请注意app_name不再存在(因为Django 1.10)和简单列表.
同样的例子urls.py,现在应该是这样的:
# myproject/urls.py
from django.urls import include, path
from products import urls as products_urls
from products import views
urlpatterns = [
path("", views.site_home, name="home"),
path("products/", include(products_urls, namespace="products"),)
]
Run Code Online (Sandbox Code Playgroud)
仍然使用像:
# products/urls.py
from django.urls import include, path
from books import urls as books_urls
from . import views
app_name = "products"
urlpatterns = [
path("", views.index, name="product_index"),
path("books/", include(books_urls, namespace="books")),
]
Run Code Online (Sandbox Code Playgroud)