使用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()

但我不能工作了,如何做到这正确的上下文中的定义穿越。


更新:要清楚我想要的 避免 添加任何其他网址(没有: 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')

甚至默认视为对象的类型(一种字典在这种情况下),正在返回:

<browser:page
  for="dict"
  name="read"
  template="read.pt"
  permission="zope.ManageContent"
/>
有帮助吗?

解决方案

它会更容易回答你的问题如果你发现什么您自行正在做的事情。

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

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

免责声明:我不知道如果看你的实例直接将保护一个安全包装;请确定你的功能测试,确保匿名用户不能视的消息,如果这就是你想要的。

其他提示

如果你在一个适当的对象,你定行,你可以粘模板上的名称和用户"上下文"在这一模板。所以 http://foo.com/folder/random_id/my_template 和模板做正常的 <h1 tal:content="context/title" /> 东西。

IIUC,你想要什么是呈现的'改为'看,当有人请求/文件夹/random_id.如果是这种情况下,所有你需要做的就是让你的穿越返回的一个目(IFolderContent,也许)代表random_id和指定"查看"页面作为默认视图用于IFolderContent.

的默认视图是必要的,因为没有鉴定的random_id对象,在你的网址。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top