1

Plone/Zope 的 z3cforms继承自 BrowserPage,因此应该能够在不使用额外的 View 和 View Class 的情况下呈现。当我尝试这样做时,表单呈现正常,但表单的字段都没有出现。我正在尝试解决为什么会发生这种情况。请记住,这个示例使用了collective.z3cform.wizard,它本质上提供了两个类,一个Wizard 和一个Step。Wizard 是一个Form(大写 F),它主要提供将 Step 粘合在一起并通过会话保持状态的机制,而Step 只是一个 Form

对我来说,感觉要么宏不正确,上下文错误,要么需要对表单进行一些包装/展开。基本上,我觉得我缺少一些神奇的代码行或一条信息,这通常是 Plone 的情况。

当表单被连接以使用单独的视图(这是多余的)时,表单可以很好地呈现所有字段。

因为我知道这很复杂,所以我在 GitHub 上构建了一个仅示例的独立包来展示这个问题。如果您将此软件包安装到带有 buildout 的股票 Plone 站点中,您将获得三个视图:

http://localhost:8080/Plone/working
http://localhost:8080/Plone/almost
http://localhost:8080/Plone/broken

工作视图需要一个单独的视图和一个完整的模板包装 TAL 标签,这既是杂乱无章的又是多余的……但它可以工作并呈现带有所有字段的表单。

损坏的视图按照应有的方式连接起来,表单实例代表视图本身,模板Wizard 类中定义

几乎视图与断开视图相同,只是模板与向导的步骤相关联,而不是与向导本身相关联。这会导致渲染中断,但表单会使用其所有字段进行渲染。

我希望有人可以帮助我追查为什么损坏的视图会呈现表单,并带有按钮,但没有表单的字段。

先感谢您。

4

1 回答 1

5

您的损坏视图不会呈现字段,因为它不会尝试呈现当前步骤。默认向导模板中包含以下内容:

<div tal:define="form nocall:view/currentStep"
   tal:replace="structure form/render" />

它查找当前步骤并呈现它。但是你已经用你自己的模板覆盖了它,它只调用了 ploneform-macros,这是一个通用的 z3c.form 东西,对步骤的存在一无所知。

您应该坚持使用默认的向导模板而不是覆盖它,或者如果您需要自定义它,您应该从collective.z3cform.wizard 复制默认的wizard.pt 作为起点。


同时,您的“几乎”观点确实几乎奏效了。这里的问题是向导的默认模板在中间呈现步骤的模板......但是您的步骤模板设置为生成完整的 html 页面(因为它使用来自 main_template 的主宏)。如果您需要自定义此模板,我再次建议您从 czwizard (wizard-step.pt) 复制默认步骤模板开始

于 2013-06-27T18:12:21.607 回答