我假设您在 Github 上使用它ixds.covalent
。
这里有两种不同的模板注册机制。
该类ActivateForm
派生自plone.directives.form.Form
,而后者又使用five.grok
包。因此ActivateForm
在启动时是“grokked”的,这意味着它在 Zope 中的注册是自动完成的,无需在另一个文件中单独输入。对开发者来说非常方便ixds.covalent
。
grok 机制还允许开发人员为表单创建一个自动注册的模板。他们可以创建一个包含模块名称加上“_templates”(covalent_member_templates
)的目录和一个匹配类名(activateform.pt
)的文件。
但在这种情况下,开发人员并没有选择这样做。plone.directives.form
存在使开发人员更容易创建表单,例如不需要专用模板。如您所见,没有什么可以阻止您ixds.covalent
按照标准 grok 方法在包中创建该模板。
但是当然不建议以这种方式编辑第三方包。您可以在自己的包中自定义表单。但是您不能使用z3c.jbot
,因为没有要覆盖的现有模板。您必须重写ActivateForm
该类并自己使用 grok 模板技术。
所以,在你的 my.theme 包中确保你有interfaces.py
:
from zope.interface import Interface
class IMyTheme(Interface):
"""Marker interface that defines a ZTK browser layer.
"""
在profiles/default/browserlayer.xml
:
<layers>
<layer
name="my.theme"
interface="my.theme.interfaces.IMyTheme"
/>
</layers>
在configure.zcml
:
...
<!-- Grok the package -->
<grok:grok package="."/>
...
在covalent_member.py
:
from five import grok
from ixds.covalent.behaviors.covalent_member import ActivateForm \
as OriginalActivateForm
from my.theme.interfaces import IMyTheme
class ActivateForm(OriginalActivateForm):
grok.layer(IMyTheme)
在covalent_member_templates/activateform.pt
:
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:metal="http://xml.zope.org/namespaces/metal"
xmlns:tal="http://xml.zope.org/namespaces/tal"
xmlns:i18n="http://xml.zope.org/namespaces/i18n"
i18n:domain="my.theme"
metal:use-macro="context/main_template/macros/master">
<metal:block fill-slot="main">
<h1 class="documentFirstHeading" tal:content="view/label | nothing" />
<p>Hey there. I'd really like you to fill out this form.</p>
<div id="content-core">
<metal:block use-macro="context/@@ploneform-macros/titlelessform" />
</div>
</metal:block>
</html>
...您将看到呈现的自定义模板。