我来自Cake背景,我现在才刚刚开始学习 Django。我非常喜欢它,但我有点希望它像 cake 那样使用约定而不是配置。所以,
如何自动获取 Cake 风格的 URL?例如,如果我去
mysite.com/posts/view/5
它会加载mysite.posts.views.view
并传递一个参数5
给它?我在想我可以(r'^(.*)/(.*)', 'mysite.$1.$2'),
在 urls.py 中添加类似的东西,但当然,那是行不通的。如何自动加载模板?每个视图函数都应该自动加载一个模板,例如
templates/posts/view.html
.
这甚至可能吗,还是我必须破解 Django 的核心?
这是我的解决方案,基于卡尔的建议:
urlpatterns = patterns('',
# url pats here
url(r'^(?P<app>\w+)/(?P<view>\w+)/(?P<args>.*)$', 'urls.dispatch')
)
def dispatch(req, app, view, args): # FIXME: ignores decorators on view func!
func = get_callable(app+'.views.'+view)
if args:
ret = func(req, *args.split('/'))
else:
ret = func(req)
if type(ret) is dict:
return render_to_response(app+'/'+view+'.html', ret)
else:
return ret
似乎在初始测试中运行良好。用一个函数解决这两个问题。可能不支持 GET 样式的参数。