0

使用 Marius Gedminas 的优秀博客文章,我为我的站点中的文件夹创建了一个自定义遍历器。

这让我可以展示: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()

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


更新:要清楚,我想避免在 url 中添加任何其他内容(: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"
/>
4

3 回答 3

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')

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

于 2009-11-18T14:58:06.057 回答
0

如果您最终使用自定义遍历器获得了正确的对象,则可以在该模板中添加模板名称和用户“上下文”。所以http://foo.com/folder/random_id/my_template在模板中做正常的<h1 tal:content="context/title" />事情。

于 2009-11-18T08:38:28.760 回答
0

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

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

于 2009-11-18T12:43:45.440 回答