自定义遍历和页面模板
使用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"
/>
如果你展示了你的自定义遍历器正在做什么,回答你的问题会更容易。
本质上讲,你想是这样的:
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')
免责声明简单的东西:我不知道,如果你直接实例化的视图将被保护通过安全包装;确保你的功能测试确保匿名用户无法查看消息,如果这是你想要的。
如果你在适当的对象最终获得您的自定义遍历器,你可以粘在模板名称和用户“上下文”:针对要返回的对象类型(在这种情况下,一个字典)ULT视图在该模板中。所以http://foo.com/folder/random_id/my_template
和在模板中做正常<h1 tal:content="context/title" />
的东西。
我想通过Python设置模板,如果可以的话,避免添加任何东西到路径。 – 2009-11-18 10:00:11
IIUC,你想要的是当有人请求/文件夹/ random_id时呈现'阅读'视图。如果是这样的话,你所需要做的就是让你的遍历返回一个表示random_id的对象(IFolderContent,也许),并将'view'页面指定为IFolderContent的defaultView。
defaultView是需要的,因为没有为您的URL中的random_id对象指定视图。
这将是“正确”的方式 - 从一开始,对象应该有一个接口 - 但现在增加一个会涉及一些相当恶劣的世代。 – 2009-11-18 15:27:30
是的,这个按照你的建议工作 - 虽然我最终在你回答之前使用了以下内容,但它是相似的 - 但是更加混乱/ hackier: return getMultiAdapter((self.context [name],self.request),名= u'read') – 2009-11-18 15:31:04