如何在不使用文件的情况下以编程方式将模板文本传递给视图?

Wolfrevo

我正在编写一些测试,我需要在视图中使用模板而不使用文件(例如通过ViewPageTemplateFile)。模板必须评估tal表达式并访问视图的功能。这是我目前的问题。在评估viewPageTemplate中的时出现错误我不确定我的代码是否遵循最佳实践。

from plone.app.testing import TEST_USER_NAME, TEST_USER_PASSWORD
from plone.testing.z2 import Browser
from zope.component import getGlobalSiteManager
from zope.publisher.interfaces.browser import IBrowserView
from Products.Five.browser import BrowserView
from zope.pagetemplate.pagetemplate import PageTemplate

class MyView(BrowserView):
    def __init__(self, context, request):
        self.context = context
        self.request = request
    def render(self):
        template = PageTemplate()
        text = '''\
<div tal:on-error="string:view fails"><span tal:replace="view/var"/></div>
<div tal:on-error="string:python fails"><span tal:replace="python:'python works'"/></div>
            '''
        template.write(text)
        return template()
    def __call__(self):
        return self.render()
    def var(self):
        return 'my_value'

global_site_manager = getGlobalSiteManager()
global_site_manager.registerAdapter(MyView, (None, None), IBrowserView, 'my_view')

browser=Browser(app.Plone)
browser.addHeader('Authorization',
                  'Basic %s:%s' % (TEST_USER_NAME, TEST_USER_PASSWORD))
browser.open(app.Plone.absolute_url() + '/@@my_view')
print browser.contents

产生以下输出:

<div>view fails</div>
<div>
    python works
</div>
Wolfrevo

我的解决方法到现在为止是创造我自己的class MyPageTemplate(PageTemplate),通过视图的实例作为参数的构造函数,并覆盖pt_getContext有填充命名空间viewcontext以及request从实例。

我想知道是否有更好的解决方案(最佳做法)。

这是我的解决方法:

from plone.app.testing import TEST_USER_NAME
from plone.app.testing import TEST_USER_PASSWORD
from plone.testing.z2 import Browser
from zope.component import getGlobalSiteManager
from zope.publisher.interfaces.browser import IBrowserView
from Products.Five.browser import BrowserView
from Products.Five.browser.pagetemplatefile import ViewPageTemplateFile
from zope.pagetemplate.pagetemplate import PageTemplate
from zope.interface import Interface
from zope.publisher.browser import IDefaultBrowserLayer

class MyPageTemplate(PageTemplate):
    instance = None
    def __init__(self, instance):
        self.instance = instance
    def pt_getContext(self, instance, request, **kw):
        namespace = super(MyPageTemplate, self).pt_getContext(**kw)
        namespace['view'] = self.instance
        namespace['context'] = self.instance.context
        namespace['request'] = self.instance.request
        return namespace

class MyView(BrowserView):
    def __init__(self, context, request):
        self.context = context
        self.request = request
    def render(self):
        template = MyPageTemplate(self)
        text = '''\
<div tal:on-error="string:request fails">request<span tal:replace="structure request"/> works</div>
<div tal:on-error="string:context fails">context/id=<span tal:replace="context/id"/> works</div>
<div tal:on-error="string:view fails">view/my_var=<span tal:replace="view/my_var"/> works</div>
<div tal:on-error="string:python fails"><span tal:replace="python:'python works'"/></div>
            '''
        template.write(text)
        return template()
    def __call__(self):
        return self.render()
    def my_var(self):
        return 'my_value'

global_site_manager = getGlobalSiteManager()
global_site_manager.registerAdapter(MyView, (None, None), IBrowserView, 'my_view')

browser=Browser(app.Plone)
browser.addHeader('Authorization', 'Basic %s:%s' % (TEST_USER_NAME, TEST_USER_PASSWORD))
browser.open(app.Plone.absolute_url() + '/@@my_view')
print browser.contents

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在不使用任何SSRS和reportviewer的情况下以编程方式执行.rdl文件并将其导出为pdf

来自分类Dev

如何在没有uri的情况下将查询传递给rest模板中的url

来自分类Dev

如何在不使用表单的情况下将文本字段数据从html传递到servlet

来自分类Dev

uboot如何在不使用DTS的情况下将硬件信息传递给内核

来自分类Dev

如何在不使用JSF中的隐藏标签的情况下将javascript内部的值传递给托管bean属性?

来自分类Dev

如何在不使用prefeb的情况下以编程方式创建精灵?

来自分类Dev

如何在不使用原始字符串的情况下将sed命令传递给popen?

来自分类Dev

如何在不使用.babelrc文件的情况下将两个预设参数传递给babel?

来自分类Dev

Laravel 5.1:如何在不使用视图的情况下传递HTML正文和文本正文?

来自分类Dev

如何在不使用onCreate()的情况下将数据从BroadcastReceiver传递到Activity

来自分类Dev

如何在不使用渲染模板的情况下从Flask中传递变量?

来自分类Dev

如何在显示文件中不使用if语句和foreach的情况下将数据传递到视图?

来自分类Dev

Laravel表单:如何在不使用表单的情况下将隐藏信息传递给控制器

来自分类Dev

如何在不使用模板的情况下将左值传递给仅采用右值的函数

来自分类Dev

如何在不使用argv和argc的情况下将总和值传递给C ++程序

来自分类Dev

如何在不使用AppDelegate的情况下以编程方式添加UITabBarController?

来自分类Dev

uboot如何在不使用DTS的情况下将硬件信息传递给内核

来自分类Dev

如何在不使用JSF中的隐藏标签的情况下将javascript内部的值传递给托管bean属性?

来自分类Dev

如何在不使用Ajax / JQuery的情况下将数量从视图传递到控制器

来自分类Dev

Laravel 5.1:如何在不使用视图的情况下传递HTML正文和文本正文?

来自分类Dev

如何在React中不使用props的情况下将函数传递给组件的层次结构?

来自分类Dev

如何在不使用文本编辑器的情况下查看文件的内容

来自分类Dev

如何在不使用 startActivity() 的情况下将值传递给另一个类

来自分类Dev

如何在不使用编辑器的情况下以编程方式在 Eclipse 中保存文件?

来自分类Dev

如何在不使用 Ajax 的情况下将值从 PHP 传递到 Javascript?

来自分类Dev

如何在不使用 JSON 的情况下将 php 数组值传递给 javascript

来自分类Dev

Express - 如何在不使用查询字符串参数的情况下将数据传递给模型

来自分类Dev

如何在不使用angular的情况下将输入值从父组件传递给子组件?

来自分类Dev

如何在不使用 UINavigationController 的情况下以编程方式进入 rootViewController

Related 相关文章

  1. 1

    如何在不使用任何SSRS和reportviewer的情况下以编程方式执行.rdl文件并将其导出为pdf

  2. 2

    如何在没有uri的情况下将查询传递给rest模板中的url

  3. 3

    如何在不使用表单的情况下将文本字段数据从html传递到servlet

  4. 4

    uboot如何在不使用DTS的情况下将硬件信息传递给内核

  5. 5

    如何在不使用JSF中的隐藏标签的情况下将javascript内部的值传递给托管bean属性?

  6. 6

    如何在不使用prefeb的情况下以编程方式创建精灵?

  7. 7

    如何在不使用原始字符串的情况下将sed命令传递给popen?

  8. 8

    如何在不使用.babelrc文件的情况下将两个预设参数传递给babel?

  9. 9

    Laravel 5.1:如何在不使用视图的情况下传递HTML正文和文本正文?

  10. 10

    如何在不使用onCreate()的情况下将数据从BroadcastReceiver传递到Activity

  11. 11

    如何在不使用渲染模板的情况下从Flask中传递变量?

  12. 12

    如何在显示文件中不使用if语句和foreach的情况下将数据传递到视图?

  13. 13

    Laravel表单:如何在不使用表单的情况下将隐藏信息传递给控制器

  14. 14

    如何在不使用模板的情况下将左值传递给仅采用右值的函数

  15. 15

    如何在不使用argv和argc的情况下将总和值传递给C ++程序

  16. 16

    如何在不使用AppDelegate的情况下以编程方式添加UITabBarController?

  17. 17

    uboot如何在不使用DTS的情况下将硬件信息传递给内核

  18. 18

    如何在不使用JSF中的隐藏标签的情况下将javascript内部的值传递给托管bean属性?

  19. 19

    如何在不使用Ajax / JQuery的情况下将数量从视图传递到控制器

  20. 20

    Laravel 5.1:如何在不使用视图的情况下传递HTML正文和文本正文?

  21. 21

    如何在React中不使用props的情况下将函数传递给组件的层次结构?

  22. 22

    如何在不使用文本编辑器的情况下查看文件的内容

  23. 23

    如何在不使用 startActivity() 的情况下将值传递给另一个类

  24. 24

    如何在不使用编辑器的情况下以编程方式在 Eclipse 中保存文件?

  25. 25

    如何在不使用 Ajax 的情况下将值从 PHP 传递到 Javascript?

  26. 26

    如何在不使用 JSON 的情况下将 php 数组值传递给 javascript

  27. 27

    Express - 如何在不使用查询字符串参数的情况下将数据传递给模型

  28. 28

    如何在不使用angular的情况下将输入值从父组件传递给子组件?

  29. 29

    如何在不使用 UINavigationController 的情况下以编程方式进入 rootViewController

热门标签

归档