2

我在 BrowserView 的上下文中。我想在页面内呈现一个表单。

class CommandeView(BrowserView):
    ...
    def render_myform(self):
        livraison_form = LivraisonForm(self.context, self.request)
        livraison_form.update()
        return livraison_form.render()

class ILivraisonForm(interface.Interface):
    livraison = schema.Choice(title=_(u"Mode de livraison"),
                          vocabulary=livraison_vocabulary)


class LivraisonForm(AutoExtensibleForm, form.EditForm):
    schema = ILivraisonForm

class LivraisonFormAdapter(object):
    component.adapts(ICommande)
    interface.implements(ILivraisonForm)
    def __init__(self, context):
        self.context = context
        self.livraison = self.context.livraison

我希望 render_myform 只呈现表单,但它返回一个 HTML Plone 页面。

欢迎任何提示。

4

1 回答 1

2

还没有深入检查这个,但表单可能是由 ploneFormWrapper类包装的。

在实例上查找.form属性:LivraisonForm

def render_myform(self):
    livraison_form = LivraisonForm(self.context, self.request).form
    livraison_form.update()
    return livraison_form.render()

可能需要在请求中添加一个额外的接口才能使其正常工作(包装器通常会为您执行此操作。我现在的时间有点少,所以您未经测试:

from plone.z3cform import z2

class CommandeView(BrowserView):
    def render_myform(self):
        z2.switch_on(self)  # Apply layer interface, set up locale, add `getURL` method
        livraison_form = LivraisonForm(self.context, self.request).form
        livraison_form.update()
        return livraison_form.render()

Plone 知识库使用相同的设置在 viewlet 中显示表单

于 2012-08-17T10:10:09.673 回答