grok的页面模板组件,基于zope.page template

megrok.pagetemplate的Python项目详细描述


导言

megrok.pagetemplate是位于^{tt2}上方的一个薄薄的Grok层$ 包裹。它允许开发人员注册ipagetemplate组件 使用Grokked组件。语法应该非常简单 可读性megrok.pagetemplate只提供一个名为 pagetemplate并使用基本的grokcore.view指令:名称视图上下文。为了使它更简单和直接,它使用 用于注册模板文件的grokcore.view模板注册表 与PageTemplate组件关联。

开始

首先,我们导入依赖项:

>>> import grokcore.view as view
>>> import megrok.pagetemplate as pt
>>> from grokcore.component.testing import grok, grok_component

一个完整而不言自明的例子

为了开始代码本身,让我们解释后面的概念 页面模板组件。显示器通常由 专用组件:视图视图是一个多适配器 上下文和请求。它提供了一种渲染方法 (通常是打电话)如果我们想定制一个视图,我们需要 子类化或重写它在这两种情况下,我们最终得到一个新的 视图和某些代码可能必须重复

pagetemplate组件允许您在呈现时进行交互 水平。这个新组件实现了zope.pagetemplate ipagetemplate接口,注册为多适配器,适应 视图和层(请求类型)。此页面模板可以命名为 更多定制可能性。

让我们建立一个具体的例子来了解这个概念。首先,我们需要 上下文我们的用途是为 可爱的动物:猛犸。首先,让我们创造我们的猛犸象 显示它的简单视图:

>>> from zope.component import getMultiAdapter
>>> from zope.pagetemplate.interfaces import IPageTemplate

>>> class Mammoth(view.Context):
...     """A furry pachyderm
...     """
...     nickname = u"Grokky"


>>> class MammothView(view.View):
...     """A view that display a mammoth
...     """
...     view.context(Mammoth)
...
...     def update(self):
...         self.mammoth_name = u"My name is %s." % self.context.nickname
...
...     def render(self):
...         template = getMultiAdapter((self, self.request), IPageTemplate)
...         return template()

>>> grok_component('my_mammoth_view', MammothView)
True

正如我们在这里看到的,view render方法是对 页面模板组件。它将呈现 注册表查找。

为了完整起见,这里,我们将提供一个IPageTemplate组件:

>>> class NakedMammoth(pt.PageTemplate):
...     """A mammoth shown in its simpliest apparel
...     """
...     pt.view(MammothView)
...     template = view.PageTemplate(
...        '<span tal:replace="view/mammoth_name" /> I am naked !'
...        )

>>> grok_component('NakedMammoth', NakedMammoth)
True

现在我们的模板已经注册,我们可以尝试调用视图和 要渲染它:

>>> from zope.publisher.browser import TestRequest
>>> request = TestRequest()
>>> mammoth = Mammoth()

>>> mnv = getMultiAdapter((mammoth, request), name="mammothview")
>>> print mnv()
My name is Grokky. I am naked !
<BLANKLINE>

我们的猛犸象是按预期的样子出现的。不过,我们不能体面地离开 这家伙光着身子。它需要一些皮毛来抵御严寒 西伯利亚的冬天。

为了定制我们的猛犸象渲染,将其从裸体更改为 毛茸茸的,我们将创造一个皮肤,我们将注册我们的新“毛茸茸” 模板组件:

>>> from zope.publisher.interfaces import browser
>>> class IFurryLayer(browser.IDefaultBrowserLayer):
...     """A layer for furry animals.
...     """
>>> furry_request = TestRequest(skin=IFurryLayer)


>>> class FurryMammoth(pt.PageTemplate):
...     """A mammoth shown in its simpliest apparel
...     """
...     pt.view(MammothView)
...     pt.layer(IFurryLayer)
...     template = view.PageTemplate(
...        '<span tal:replace="view/mammoth_name" /> I am all furry !'
...        )

>>> grok_component('FurryMammoth', FurryMammoth)
True

我们注册了新模板,现在可以测试是否一切正常 如预期使用新的皮肤,我们的猛犸象现在应该毛茸茸的:

>>> mfv = getMultiAdapter((mammoth, furry_request), name="mammothview")
>>> print mfv()
My name is Grokky. I am all furry !
<BLANKLINE>

注意-我们可以使用非常方便的功能查询组件:

>>> print pt.getPageTemplate(mfv, furry_request)
<megrok.pagetemplate.components.ViewPageTemplate object at ...>

太棒了。我们的猛犸象现在已经做好了抵御寒冷的充分准备。不过, 让我们确保最简单的要求把动物从温暖的环境中带走 头发:

>>> mnv = getMultiAdapter((mammoth, request), name="mammothview")
>>> print mnv()
My name is Grokky. I am naked !
<BLANKLINE>

那很有效。享受吧!

变更日志

0.7(2011-01-31)

  • 我们现在使用grokcore.view包中的最新更改 独立模板grokker,以避免重新实现整个 机制。
  • 更新为与Grok 1.3+一起使用

0.6(2010-11-10)

  • 测试最新的grokcore包。
  • 已删除对grokcore.viewletzope.testing的依赖项。

0.5(2010-05-27)

  • 清理代码以遵守严格的PEP8。已删除未使用的导入。
  • Grok 1.1测试

0.4.1(2010-02-22)

  • 清单已更新,因此测试的“模板”文件夹 模块现在是源版本的一部分(因此测试现在运行 正确)。

0.4(2010-02-21)

  • 清理依赖项,以删除所有zope.app 人工产品。
  • 清理了进口和测试。

0.3-Beta3版本

  • 要导入的修改测试所有直接需要的指令 packagemegrok.pagetemplate本身[巨魔]
  • 添加了一个方便的函数getPageTemplate来查询页面 模板组件

0.2-β2释放

  • megrok.pagetemplate已升级为使用最新的 grokcore.view(1.12.1)测试已更正,代码视图为 跑了。[巨魔]

0.1-β1释放

  • 初始版本[trollfot]

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

推荐PyPI第三方库


热门话题
在数据库中存储密码的java加密方法   java正则表达式否定整个正则表达式   java为什么要得到这个Hashmap输出?   看不到玻璃鱼爪哇SE 6   类对象包装器中的Java基本数据字段   java从文本文件中读取整数并存储到单独的变量中?(扫描仪)   优化大型Java数据阵列的处理和管理   如何使用Java XML包装类创建对象   java为ExecutorService invokeAll()创建包装器   java如何在Android Studio 1.0.0中设置Facebook SDK?获取SDK位置未找到错误   java在尝试从线程启动动画时调用了FromErrorThreadException   java根据哈希确认文件内容   通过java在neo4j中获取索引值相同的所有节点?   java为什么我的Validare邮政编码(布尔)程序返回false?   java会话自动从servlet/jsp生成,尽管存在以下条件:<%@page session=“false”%>   创建新LANsocket时拒绝java连接   java如何多线程更新由sql代码更新的数据库?   安卓 Java使用类作为集合来添加项   安卓为什么我的清单文件不声明java包?