如何根据参数更改BrowserView上使用的模板

时间:2014-05-20 09:38:23

标签: plone

我们有一个名为@@export的视图,需要一个可选参数version,因此您可以像@@export?version=3一样调用它。

由于每个版本可以彼此完全不同,执行一个巨大的模板以将所有版本保持在一起将是一个维护的噩梦,所以我们认为在BrowserView的__call__方法上我们可以动态地改变使用的模板,如下所示:

class MyView(BrowserView):
    template = ViewPageTemplateFile('default_template.pt')

    def __call__(self):
        version = self.request.get('version', None)
        if version is not None:
        self.template = ViewPageTemplateFile('export-{0}.pt'.format(version))
        return self.template()

原来它不起作用。但实际上尝试使用调试控制台我们就这样工作了:

class MyView(BrowserView):
    template = ViewPageTemplateFile('default_template.pt')

    def __call__(self):
        version = self.request.get('version', None)
        if version is not None:
            self.template = ViewPageTemplateFile('export-{0}.pt'.format(version))
            return self.template(self)
        return self.template()

注意if代码路径的返回。

是否有其他方法可以动态更改正在使用的模板?因为return self.template(self)对我来说似乎并不理智。

1 个答案:

答案 0 :(得分:0)

您可以尝试将逻辑放入 init 方法而不是调用方法,但我建议为每个目的创建单独的页面并从主节点遍历它们页。通过zcml:pages共享页面的元信息(界面,权限)很容易。