使用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"
/>
答案 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对象指定视图。