如何使用plone.app.registry

2024-05-23 20:53:35 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个由生成的附加配置页面/表单plone.app.registry.浏览器控制面板在

使用这些文档:
http://plone.org/documentation/kb/how-to-create-a-plone-control-panel-with-plone.app.registryhttps://pypi.python.org/pypi/plone.app.registry#control-panel-widget-settings

在这个表单中,我有一个整数字段:

from zope import schema
from plone.app.registry.browser import controlpanel

class MyAddonSettings(Interface):
    partnerId = schema.Int(title=u"Partner Id",
                           description=u"enter your Partner ID",
                           required=True,
                           default=54321)

class SettingsEditForm(controlpanel.RegistryEditForm):
    schema = MyAddonSettings
    label = u"My settings"
    description = u""""""

    def updateFields(self):
        super(SettingsEditForm, self).updateFields()    

    def updateWidgets(self):
        super(SettingsEditForm, self).updateWidgets()    

class SettingsControlPanel(controlpanel.ControlPanelFormWrapper):
    form = SettingsEditForm

当表单呈现时,我得到的整数字段自动填充了“54321”,我不想要逗号。在

如何指定“不要那样做!”在


Tags: fromorgselfpypiapp表单settingsschema
1条回答
网友
1楼 · 发布于 2024-05-23 20:53:35

所以,我想我已经深入兔子洞了,但这是我想到的。在

1)的默认控件zope.schema.Int是TextWidget

2)z3c。form.converter.IntegerDataConverter适应zope.schema.interfaces.IInt和ITextWidget

3)IntegerDataConverter调用语言环境来为您“格式化整数”,为您提供了一个带有逗号的int的漂亮表示。在

我的选择是创建一个新的widget“IntWidget”和一个新的转换器“NoFormatIntegerDataConverter”,调整它们。然后手动将有问题的字段设置为我的新小部件:

我相信有一个不那么“兔子洞”的方法来做,但我发现自己在底部,所以我完成了旅程。我会让一个zope专家跟进“正确”的方法。在

=========================

基于TextWidget创建新的小部件

所以我们不会把我们的新转换器绑定到每个人的TextWidget上,破坏别人的东西

import zope.interface
import zope.component
import zope.schema.interfaces

import z3c.form.interfaces
from z3c.form.widget import FieldWidget
from z3c.form.browser.text import TextWidget
from z3c.form import converter

class IIntWidget(z3c.form.interfaces.ITextWidget):
    """Int Widget"""

class IntWidget(TextWidget):
    zope.interface.implementsOnly(IIntWidget)
    klass = u'int-widget'
    value = u''

@zope.component.adapter(zope.schema.interfaces.IField, 
                        z3c.form.interfaces.IFormLayer)
@zope.interface.implementer(z3c.form.interfaces.IFieldWidget)
def IntFieldWidget(field, request):
    """IFieldWidget factory for IntWidget."""
    return FieldWidget(field, IntWidget(request))

zope.component.provideAdapter(IntFieldWidget)

创建“dumb”转换器,并将其调整为新的widget“IntWidget”

^{pr2}$

最后,更新fieldwidget工厂以使用我们的新widget

^{3}$

相关问题 更多 >