https://community.plone.org/t/computed-field-for-dexterity/11405
If the text value is not set, use this:
class MyForm(Form):
def updateWidgets(self):
super(MyForm, self).updateWidgets()
self.widgets["field_id"].value = Markup(
"<div>Congrats <b>1_000_000th</b> visitor!</div>"
)
First of all, we need to create the adapter::
# -*- coding: utf-8 -*-
from some.package.browser.form import OriginalForm
from persistent import Persistent
from plone.z3cform.fieldsets import extensible
from some.package.content import OriginalContentType
from z3c.form.field import Fields
from zope import schema
from zope.annotation import factory
from zope.component import adapter
from zope.interface import implementer
from zope.interface import Interface
from zope.publisher.interfaces.browser import IDefaultBrowserLayer
# define a schema
class IMyExtenderSchema(Interface):
new_field = schema.TextLine(title=u"New field", required=False)
# Persistent class that implements the IMyExtenderSchema interface and is adapted to a context
@adapter(OriginalContentType)
@implementer(IMyExtenderSchema)
class ExtenderFields(Persistent):
new_field = u""
ExtenderFactory = factory(ExtenderFields)
# Extending the form with the fields defined in the
# IMyExtenderSchema interface.
@adapter(Interface, IDefaultBrowserLayer, OriginalForm)
class Extender(extensible.FormExtender):
fields = Fields(IMyExtenderSchema)
def __init__(self, context, request, form):
self.context = context
self.request = request
self.form = form
def update(self):
self.add(IMyExtenderSchema, prefix="")
# here you can also move or customize fields
And then you need to register these adapters::
<adapter
factory=".my_extender.ExtenderFactory"
provides=".my_extender.IExtenderFields" />
<adapter
factory=".my_extender.Extender"
provides="plone.z3cform.fieldsets.interfaces.IFormExtender" />
References: