视图模板

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

为什么我们不使用 zope.formlib包中的命名模板?

而命名模板允许我们将视图代码与模板分离 注册,它们不可注册为特定层 无法使用命名模板实现多个外观。

页面模板

为了最简单的使用,我们提供了一个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.

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java Kafka在producer上流式传输自定义头   java ExecutorService:不需要输出   java并发读取不可修改的映射   如何匹配Java计算机的给定输出猜你的数字游戏;二进制搜索   java使用数据库创建新对象   javascript如何用spring mvc上传图像我尝试了这种方法,如何解决这个问题   java如何使用Quarkus Panache仅选择某些字段?   java如何通知其他对象(如何“关闭”队列)ArrayBlockingQueue中将不再有元素,   java使用JavaFX MediaPlayer从MP3读取ID3v2标记   当我们在Android上打开应用程序时,java仅在第三次显示toast   apache spark java。RuntimeException:java。lang.Integer不是bigint:java架构的有效外部类型。伊奥。IOException   模拟插座。用于测试Java的getOutputStream()   java在git对分期间,只运行失败的测试安全吗?或者我们应该运行所有测试?   java Android MediaPlayer音量非常低(已调整音量)   java组织。冬眠服务UnknownServiceException:请求的未知服务[org.hibernate.ogm.service.impl.OgmConfigurationService]   java扫描程序没有停止   java无法在JBoss EAP 6.2上调用远程EJB