使用plone.app.z3cform </style>加载<style>块

时间:2012-09-22 09:59:07

标签: plone

我在下面有一个grok'ed plone.directives.form代码:

class EditForm(TreeFormMixin, form.SchemaForm):
    """
    Edit form for our model.

    We got one dummy button which allows us to manually inspect the data postback values.
    """
    grok.context(ISiteRoot)
    grok.name("dgftreeselect-test")
    grok.require('zope2.View')

    ignoreContext = True
    schema = IFormSchema

    label = u"Tree selection demo and manual testing"

    @button.buttonAndHandler(u'Turbo boost')
    def handleApply(self, action):

        data, errors = self.extractData()
        if errors:
            self.status = self.formErrorsMessage
            return

        raise ActionExecutionError(Invalid(u"Please see that data stays intact over postback"))

它导致了这种形式 - 这看起来并不好看:

DGFs in the action

由于它是一个演示表单,我想将所有相关资料保存在同一个.py文件中。但是,由于表单难看,我想从Python源代码字符串中在页面上注入一个<style> CSS块来修复CSS样式中一些最突出的问题。

plone.app.forms / BrowserViews提供什么样的钩子来在<style>或生成的HTML页面的任何部分中注入您自己的<head>块?我不想为此任务创建任何其他文件和CSS注册。

完整来源:

https://github.com/miohtama/collective.z3cform.dgftreeselect/blob/master/src/collective/z3cform/dgftreeselect/testform.py

1 个答案:

答案 0 :(得分:2)

plone.app.z3cform和Zope浏览器视图不提供任何钩子直接将自定义内容注入头部,但您可以通过在表单类中指定模板属性来使用自定义模板:

template = grok.Template('path/to/template.pt')

然后在template.pt中,填充style_slot以包含您的样式。整个模板可能如下所示:

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"
      xmlns:tal="http://xml.zope.org/namespaces/tal"
      xmlns:metal="http://xml.zope.org/namespaces/metal"
      xmlns:i18n="http://xml.zope.org/namespaces/i18n"
      lang="en"
      metal:use-macro="context/main_template/macros/master"
      i18n:domain="plone">
<body>

<metal:block fill-slot="style_slot">
    <style type="text/css">
      /* insert styles here */
    </style>
</metal:block>

<metal:content-core fill-slot="main">
  <metal:content-core define-macro="content-core">
      <tal:button metal:use-macro="context/@@ploneform-macros/titlelessform" />
  </metal:content-core>
</metal:content-core>

</body>
</html>

这不是最佳做法,因为每次呈现窗口小部件时都必须提供样式。相反,通常最好在portal_css工具中注册CSS。