自定义遍历和页面模板

时间:2009-11-17 21:50:38

标签: python zope zpt

使用Marius Gedminas的excellent blog post,我为我网站中的文件夹创建了一个自定义遍历器。

这允许我显示:http://foo.com/folder/random_id

而不是:http://foo.com/folder/object.html?id=random_id

配置方面效果很好,我可以捕获random_ids并在我的消息中搜索正确的消息,准备显示。

我的问题是,我不确定如何通过我常用的页面模板显示数据 - 在原始代码的TODO点;)

if name == 'mycalendar':
            mycalendar = ... # TODO: do something to get the appropriate object
            return mycalendar

通常我会使用类似的东西:

class Test(BrowserPage):

    template = ViewPageTemplateFile('atest.pt')

    def __call__(self):
        return self.template()

但我无法弄清楚如何在自定义遍历的上下文中正确地执行此操作。


更新:要明确我要避免向网址添加任何其他内容(http://foo.com/folder/random_id/read)。

需要通过任何其他地址提供视图(http://foo.com/folder/read

我想使用的视图的ZCML是:

<browser:page
  for="foo.interfaces.IFooFolderContainer"
  name="read"
  template="read.pt"
  permission="zope.ManageContent"
/>

我猜测(根据进一步的建议),有些东西:

return getMultiAdapter((mycalendar, self.request), IPageTemplate, name=u'read')

甚至是正在返回的对象类型(在本例中为dict)的默认视图:

<browser:page
  for="dict"
  name="read"
  template="read.pt"
  permission="zope.ManageContent"
/>

3 个答案:

答案 0 :(得分:1)

如果您展示了自定义遍历器正在执行的操作,那么回答您的问题会更容易。

基本上,你想要这样的东西:

def publishTraverse(self, request, name):
    if name in self.context:
        return MyMessageView(self.context[name], request)

    # fall back to views such as index.html
    view = queryMultiAdapter((self.context, request), name=name)
    if view is not None:
        return view

    # give up and return a 404 Not Found error page
    raise NotFound(self.context, name, request)

其中MyMessageView可以像

一样简单
class MyMessageView(BrowserPage):
    __call__ = ViewPageTemplateFile('read.pt')

免责声明:我不确定您直接实例化的视图是否会受到安全保护程序的保护;确保您的功能测试确保匿名用户无法查看消息,如果这是您想要的。

答案 1 :(得分:0)

如果您使用自定义遍历器找到适当的对象,则可以在该模板中添加模板名称和用户“上下文”。因此http://foo.com/folder/random_id/my_template并在模板中执行正常的<h1 tal:content="context/title" />内容。

答案 2 :(得分:0)

IIUC,你想要的是当有人请求/ folder / random_id时呈现'读'视图。如果是这种情况,您需要做的就是让遍历返回一个表示random_id的对象(可能是IFolderContent),并将'view'页面指定为IFolderContent的defaultView。

需要defaultView,因为没有为您的URL中的random_id对象指定视图。