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でフォームのみをレンダリングしたいのですが、HTMLPloneページが返されます。

ヒントは大歓迎です。

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ナレッジベースはこれと同じ設定を使用してビューレットにフォームを表示します。

于 2012-08-17T10:10:09.673 に答える