2009-11-17 135 views
0

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

但我不能解决如何在自定义遍历的上下文中正确执行此操作。


UPDATE:要清楚,我想避免添加任何东西到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') 

甚至一个DEFA

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

回答

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

免责声明简单的东西:我不知道,如果你直接实例化的视图将被保护通过安全包装;确保你的功能测试确保匿名用户无法查看消息,如果这是你想要的。

+0

是的,这个按照你的建议工作 - 虽然我最终在你回答之前使用了以下内容,但它是相似的 - 但是更加混乱/ hackier: return getMultiAdapter((self.context [name],self.request),名= u'read') <浏览器:默认视图 用于= “persistent.dict.PersistentDict” 名称= “读” /> <浏览器: 页= “persistent.dict.PersistentDict” 名=“读” template =“read.pt” permission =“zope.ManageContent” /> – 2009-11-18 15:31:04

0

如果你在适当的对象最终获得您的自定义遍历器,你可以粘在模板名称和用户“上下文”:针对要返回的对象类型(在这种情况下,一个字典)ULT视图在该模板中。所以http://foo.com/folder/random_id/my_template和在模板中做正常<h1 tal:content="context/title" />的东西。

+0

我想通过Python设置模板,如果可以的话,避免添加任何东西到路径。 – 2009-11-18 10:00:11

0

IIUC,你想要的是当有人请求/文件夹/ random_id时呈现'阅读'视图。如果是这样的话,你所需要做的就是让你的遍历返回一个表示random_id的对象(IFolderContent,也许),并将'view'页面指定为IFolderContent的defaultView。

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

+0

这将是“正确”的方式 - 从一开始,对象应该有一个接口 - 但现在增加一个会涉及一些相当恶劣的世代。 – 2009-11-18 15:27:30