如果我这样做:
urlpatterns += patterns('datasets.views',
url(r'^$', 'home', name="home"),
url(r'^(?P<slug>\w+)/', include(patterns('',#HERE I OMIT THE PREFIX
url(r'^edit/', 'edit_api', name="edit_api"),
))),
)
我会在/ my-slug-name /'str'对象中得到一个``TypeError不可调用
但是如果我第二次包含前缀,它就可以了。
urlpatterns += patterns('datasets.views',
url(r'^$', 'home', name="home"),
url(r'^(?P<slug>\w+)/', include(patterns('datasets.views', #HERE THE PREFIX IS REPEATED
url(r'^edit/', 'edit_api', name="edit_api"),
))),
)
我是否误解了包含作品的方式?我应该将此报告为错误吗?
答案 0 :(得分:1)
这不是include()
的工作原理,而是patterns
的工作原理。如果没有前缀,edit_api
只是一个要模式化的字符串,它无法将其解析为视图。为第一个模式提供前缀不会使其隐含地包含在嵌套模式中。你使用模式的方式有点难看。您需要单独考虑每个patterns()
。前缀是为了使你的网址配置干净,考虑这个 -
api_patterns = patterns('datasets.views',
url(r'^edit/', 'edit_api', name="edit_api"),
# --------------^ Here edit_api is actually datasets.views.edit_api
# if you don't want to provide the prefix, you write the full path to the view
# url(r'^edit/', 'datasets.views.edit_api', name="edit_api"),
)
urlpatterns += patterns('datasets.views',
url(r'^$', 'home', name="home"),
url(r'^(?P<slug>\w+)/', include(api_patterns)),
# ------------------------------^
# Here include doesn't use the pattern prefix you used 3 lines above
)
原因是,include旨在包含来自应用程序等各个地方的模式。每个模式都可能包含单独的模式前缀。因此,为了简单起见,您要么提供模式前缀并写入相对视图名称,要么省略模式前缀并写入完整视图路径。