URL中的Django模式前缀没有传播到包含的视图:错误还是误解?

时间:2014-03-29 22:18:24

标签: django django-urls

如果我这样做:

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"),                                            
    ))),
) 

我是否误解了包含作品的方式?我应该将此报告为错误吗?

1 个答案:

答案 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旨在包含来自应用程序等各个地方的模式。每个模式都可能包含单独的模式前缀。因此,为了简单起见,您要么提供模式前缀并写入相对视图名称,要么省略模式前缀并写入完整视图路径。