将z3cform向导渲染为独立视图

时间:2013-06-27 17:58:00

标签: plone wizard zope z3c.form

Plone / Zope的z3cforms inherit from BrowserPage,因此应该能够在不使用其他视图和视图类的情况下进行渲染。当我尝试这样做时,表单呈现正常,但没有任何表单的字段出现。我试图解决为什么会发生这种情况。请记住,此示例使用collective.z3cform.wizard,它实际上提供了两个类,一个向导和一个步骤。一个Wizard is a Form(大写字母F)主要提供将步骤粘合在一起并使用会话保持状态的机制,以及Step is just a Form

对我来说,感觉就像the macro is incorrect,上下文错误,或者需要对表单进行包装/解包。基本上,我觉得我缺少一些神奇的代码或信息,这在Plone中经常出现。

当表单为wired up to use a separate view(这是多余的)时,表单会显示所有字段。

由于我理解这很复杂,我已经构建了一个仅示例standalone package on GitHub来展示问题。如果您将此软件包安装到具有buildout的库存Plone站点中,您将获得三个视图:

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

工作视图需要一个separate view和一个whole-template-wrapping TAL tag,它既是kludge又是冗余的...但它可以工作并呈现包含其所有字段的表单。

已损坏的视图wired up应该如何,表单实例代表视图本身,template defined in the Wizard class

几乎视图与损坏的视图相同,只是模板是associated with the Wizard's Step而不是向导本身。这会导致渲染损坏,但表单将呈现其所有字段。

我希望有人可以帮助我找出为什么已损坏的视图呈现表单,包含按钮,但没有表单的字段。

提前谢谢。

1 个答案:

答案 0 :(得分: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中的主宏)。如果您需要自定义此模板,我建议您首先从c.z.wizard复制默认步骤模板(wizard-step.pt)