1

我来自Cake背景,我现在才刚刚开始学习 Django。我非常喜欢它,但我有点希望它像 cake 那样使用约定而不是配置。所以,

  1. 如何自动获取 Cake 风格的 URL?例如,如果我去mysite.com/posts/view/5它会加载mysite.posts.views.view并传递一个参数5给它?我在想我可以(r'^(.*)/(.*)', 'mysite.$1.$2'),在 urls.py 中添加类似的东西,但当然,那是行不通的。

  2. 如何自动加载模板?每个视图函数都应该自动加载一个模板,例如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 样式的参数。

4

2 回答 2

4

这些要点都可以在不破解 Django 核心的情况下实现,但其中任何一个都需要对高级 Python 技术有相当程度的熟悉。

您可以使用如下模式执行通用 URL 模式:

url(r'^(?P<appname>\w+)/(?P<viewfunc>\w+)/(?P<args>.*)$', 'myresolverfunc')

然后定义一个“myresolverfunc”“view”函数,它接受“appname”、“viewfunc”和“args”参数,并实现你想要的任何逻辑,在“/”上拆分args并动态导入和调度到引用的任何视图函数. 最棘手的部分是动态导入,您可以在 Django 的源代码中搜索“importlib”以查看动态导入是如何在内部各个地方完成的。

自动模板加载器可以实现为类似于各种“render_to”装饰器的视图函数装饰器,除了您将生成模板名称而不是将其传递给装饰器。您必须自省函数对象才能获得其名称。获取应用名称会比较棘手;您可能只想在每个 views.py 文件中将其硬编码为模块级全局,或者与上述 URL 调度程序一起工作,并让它使用应用程序名称或类似名称注释请求对象。

于 2009-11-05T03:04:22.410 回答
1

我不认为你需要为此破解 Django 的核心。听起来您可能需要通用视图。另请查看通用视图主题指南

通用视图文档中给出的第一个示例听起来像您的第一个要点:

例子:

给定以下 URL 模式:

urlpatterns = patterns('django.views.generic.simple',
    (r'^foo/$',             'direct_to_template', {'template':'foo_index.html'}),
    (r'^foo/(?P<id>\d+)/$', 'direct_to_template', {'template':'foo_detail.html'}),
)

... 对 /foo/ 的请求将呈现模板 foo_index.html,对 /foo/15/ 的请求将使用设置为 15 的上下文变量 {{ params.id }} 呈现 foo_detail.html。

于 2009-11-05T00:42:11.137 回答