2

我有一个由 plone.app.registry.browser.controlpanel 生成的附加配置页面/表单

使用这些文档: http:
//plone.org/documentation/kb/how-to-create-a-plone-control-panel-with-plone.app.registry https://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

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

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

4

1 回答 1

2

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

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

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

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

我的选择是创建一个新的小部件“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)

创建“哑”转换器,并使其适应我们的新小部件“IntWidget”

class NoFormatIntegerDataConverter(converter.IntegerDataConverter):
    """ data converter that ignores the formatter, 
        simply returns the unicode representation of the integer value

        The base class for this calls upon the locale for a formatter.
        This completely avoids calling the locale.
    """

    zope.component.adapts(zope.schema.interfaces.IInt, IIntWidget)    

    def toWidgetValue(self, value):
        if value is self.field.missing_value:
            return u''
        #go look at z3c.form.converter.IntegerDataConverter 
        #to see what it used to return here.
        return unicode(value)  

zope.component.provideAdapter(NoFormatIntegerDataConverter)

最后,更新字段小部件工厂以使用我们的新小部件

class SettingsEditForm(controlpanel.RegistryEditForm):

    ...

    def updateFields(self):
        super(SettingsEditForm, self).updateFields()
        self.fields['partnerId'].widgetFactory = IntFieldWidget  #<----- Here

    ...
于 2013-09-11T23:50:50.947 回答