视图模板
z3c.viewtemplate的Python项目详细描述
详细数据说明
视图模板
这个包允许我们将视图代码和 查看模板。
为什么这是件好事?
在开发需要我们开发多个 对于一个特定的应用程序,我们注意到 皮肤和层次之间的明显区别。层包含 为表示输出准备数据,即视图类。皮肤,在 另一方面包含生成ui的资源,例如模板, 图像和css文件。
现有基础设施的问题是代码、模板和层 在视图组件的一个zcml配置指令中都是硬链接的 –页面,内容提供商,viewlet。这个包裹将这三个字母分开- 代码,模板,层-分成两对,代码/层和模板/皮肤。不 由于皮肤和层在物理上是 相同的部件。
在使用此新方法设置视图组件之前,必须先 创建模板…
< Buff行情>>>> import os, tempfile >>> temp_dir = tempfile.mkdtemp() >>> template = os.path.join(temp_dir, 'demoTemplate.pt') >>> open(template, 'w').write('''<div>demo</div>''')
视图代码:
< Buff行情>>>> from zope.publisher.browser import TestRequest >>> request = TestRequest()
>>> from zope import interface >>> from z3c.viewtemplate.baseview import BaseView >>> class IMyView(interface.Interface): ... pass >>> class MyView(BaseView): ... interface.implements(IMyView)
>>> view = MyView(root, request)
由于模板尚未注册,因此呈现视图将失败:
< Buff行情>>>> print view() Traceback (most recent call last): ... ComponentLookupError: ......
现在注册模板(通常使用zcml):
< Buff行情>>>> from zope import component >>> from zope.publisher.interfaces.browser import IDefaultBrowserLayer >>> from z3c.viewtemplate.zcml import TemplateFactory >>> from zope.pagetemplate.interfaces import IPageTemplate
模板工厂允许我们创建viewpageteplatefile实例。
< Buff行情>>>> factory = TemplateFactory(template, None, 'text/html')
我们在视图界面和层上注册工厂。
< Buff行情>>>> component.provideAdapter(factory, ... (interface.Interface, IDefaultBrowserLayer), ... IPageTemplate) >>> template = component.getMultiAdapter( ... (view, request), IPageTemplate) >>> template <zope...viewpagetemplatefile.ViewPageTemplateFile ...>
现在我们有了默认层的注册模板,我们可以 再打电话给我们。视图是一个contentprovider,因此 beforeUpdateEvent在调用其更新方法之前被激发。
< Buff行情>>>> events = [] >>> component.provideHandler(events.append, (None,)) >>> print view() <div>demo</div> >>> events [<zope.contentprovider.interfaces.BeforeUpdateEvent object at ...>]
现在,我们在视图的特定界面上注册一个新模板。
< Buff行情>>>> import os, tempfile >>> temp_dir = tempfile.mkdtemp() >>> template = os.path.join(temp_dir, 'demoTemplate.pt') >>> open(template, 'w').write('''<div>demo</div>''')0
我们还可以设置调试标志来呈现视图。
< Buff行情>>>> import os, tempfile >>> temp_dir = tempfile.mkdtemp() >>> template = os.path.join(temp_dir, 'demoTemplate.pt') >>> open(template, 'w').write('''<div>demo</div>''')1
可以直接提供模板。
我们创建了一个新模板。
< Buff行情>>>> import os, tempfile >>> temp_dir = tempfile.mkdtemp() >>> template = os.path.join(temp_dir, 'demoTemplate.pt') >>> open(template, 'w').write('''<div>demo</div>''')2
>>> import os, tempfile >>> temp_dir = tempfile.mkdtemp() >>> template = os.path.join(temp_dir, 'demoTemplate.pt') >>> open(template, 'w').write('''<div>demo</div>''')3
如果我们呈现这个视图,我们得到的是原始模板,而不是注册的 一个,
< Buff行情>>>> import os, tempfile >>> temp_dir = tempfile.mkdtemp() >>> template = os.path.join(temp_dir, 'demoTemplate.pt') >>> open(template, 'w').write('''<div>demo</div>''')4
宏的使用。
< Buff行情>>>> import os, tempfile >>> temp_dir = tempfile.mkdtemp() >>> template = os.path.join(temp_dir, 'demoTemplate.pt') >>> open(template, 'w').write('''<div>demo</div>''')5
>>> import os, tempfile >>> temp_dir = tempfile.mkdtemp() >>> template = os.path.join(temp_dir, 'demoTemplate.pt') >>> open(template, 'w').write('''<div>demo</div>''')6
既然可以将选项传递给viewlet,让我们来证明 也可以用于宏:
< Buff行情>>>> import os, tempfile >>> temp_dir = tempfile.mkdtemp() >>> template = os.path.join(temp_dir, 'demoTemplate.pt') >>> open(template, 'w').write('''<div>demo</div>''')7
为什么我们不使用
而命名模板允许我们将视图代码与模板分离 注册,它们不可注册为特定层 无法使用命名模板实现多个外观。
页面模板
为了最简单的使用,我们提供了一个registeredpagetemplate 眺望台mplatefile或namedtemplate。
registeredpagetemplate允许我们使用新的模板注册 具有所有现有实现的系统,如 zope.formlib 和 zope.viewlet
< Buff行情>>>> import os, tempfile >>> temp_dir = tempfile.mkdtemp() >>> template = os.path.join(temp_dir, 'demoTemplate.pt') >>> open(template, 'w').write('''<div>demo</div>''')8
通过将"template"属性定义为"registeredpagetemplate",查找 注册模板在调用时完成。还要注意它不是 从BaseView派生视图所需的时间更长!
< Buff行情>>>> import os, tempfile >>> temp_dir = tempfile.mkdtemp() >>> template = os.path.join(temp_dir, 'demoTemplate.pt') >>> open(template, 'w').write('''<div>demo</div>''')9
因为演示模板是为任何("无")接口注册的,我们看到 呈现新视图时的演示模板。我们注册了一个新模板 尤其是新的视角。也不是说"宏模板"已经 在本测试的前面创建。
< Buff行情>>>> from zope.publisher.browser import TestRequest >>> request = TestRequest()0
更改
0.4.1(2010-12-12)
< Buff行情>- 修正了在模板中找不到宏时的异常处理。
- 修复了测试,因此它们可以在Windows上成功运行。
- 使用python的 doctest 模块而不是不赞成 zope.testing.doctest
- 移除zcml段塞和zpkg段塞。
0.4.0(2008-11-05)
< Buff行情>- 添加了对tal调试标志的支持
0.3.2(2007-11-01)
- 修复包元数据。
0.3.1(2007-10-31)
- 错误修复:选项没有传入宏模板。
0.3.0(2007-09-27)
- 将请求添加到 beforeUpdateEvent ,这需要最近 zope.contentprovider软件包。
- 不再发布开发版本。
0.2(2007-05-01)
- 在基础视图中,在updateevent之前触发a 这需要Zope 3.4.