你能在Kotti中拥有多个内容元素的通用子视图吗?

时间:2013-09-13 08:40:15

标签: python pyramid kotti

您可以通过以下方式执行某些操作,为kotti中的内容类型添加“视图”:

from kotti_mysite.views import poll_view

config.add_view(
    poll_view,
    context=Poll,
    name='view',
    permission='view',
    renderer='kotti_mysite:templates/poll.pt',
)

(更多详情:http://kotti.readthedocs.org/en/latest/first_steps/tut-2.html

您也可以拥有多个视图,并使用“设置默认视图”,但有时候使用非常相似的网址可以很方便地获得几个相似的视图。

例如,在plone中,它有一个像这样的url结构:

  • / blah / item /< ---普通视图
  • / blah / item / json< --- Json版本的项目
  • / blah / item / pdf< --- PDF下载项目

你可以...在kotti做类似的事情,通过拧紧你创建的视图并根据get / post params呈现不同的内容,但它很混乱,坦率地说,相当垃圾。

我发现的唯一解决方案是拥有一个带有json渲染器的自定义内容类型“JsonView”,并将其添加为父对象的子级,并且它的渲染器会查找父内容并呈现它。

但是,这样做需要您为所需类型的每个实例手动创建一个'JsonView'子项,这也很麻烦。

有更好的方法吗?

-

的Nb。特别要注意的是,拥有自定义视图/ blah / item / json完全没有任何用处;任何类型的项目,在任何父文件夹中都应该能够以上述方式呈现;使用单一静态路由不是正确的解决方案。

1 个答案:

答案 0 :(得分:2)

您可以为所有内容注册json视图,如下所示:

from kotti.interfaces import IContent

config.add_view(
    my_json_view,
    context=IContent,
    name='json',
    permission='view',
    renderer='json',
)

这样,当您打开/blah/json,其中/blah指向某些内容时,它会调用您的my_json_view视图。

SQLAlchemy的new class object inspection system可能会帮助您编写适用于多种内容类型的有用的通用json视图。或者,您可以仅针对特定内容类型注册视图(通过context中使用更具体的config.add_view参数)。

使用renderer='json'告诉Pyramid您要使用其json renderer