首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何覆盖或继承z3c.form小部件?

如何覆盖或继承z3c.form小部件?
EN

Stack Overflow用户
提问于 2017-01-25 21:13:22
回答 1查看 194关注 0票数 0

我需要覆盖分配给z3c.form上字段的小部件的行为(特别是用于schema.Bool字段的小部件,如下所示),以更改小部件模式在不同条件下的工作方式:

代码语言:javascript
复制
from plone.autoform.interfaces import IFormFieldProvider
from plone.supermodel import model
from zope import schema
from zope.interface import provider

@provider(IFormFieldProvider)
class IGoogleNews(model.Schema):
    """Behavior interface to add some Google News features."""

    standout_journalism = schema.Bool(
        title=_(u'Standout Journalism'),
        required=False,
    )

    news_keywords = schema.Tuple(
        title=_(u'Keywords'),
        value_type=schema.TextLine(),
        required=False,
    )
EN

回答 1

Stack Overflow用户

发布于 2017-01-26 16:55:19

这是从ftw.datepicker小部件派生的示例代码。

在widget.py中:

代码语言:javascript
复制
# This widget has a plone integration, so we take this one as base
from plone.z3cform.widget import SingleCheckBoxWidget
from z3c.form.interfaces import DISPLAY_MODE
from z3c.form.interfaces import ISingleCheckBoxWidget
from zope.interface import implementsOnly
from zope.component import adapter
from z3c.form.interfaces import IFormLayer
from z3c.form.interfaces import IFieldWidget
from z3c.form.widget import FieldWidget


class IMyBoolWidget(ISingleCheckBoxWidget):
    """Marker interface"""


class MyBoolWidget(SingleCheckBoxWidget)
    implementsOnly(IMyBoolWidget)

    display_template = ViewPageTemplateFile('templates/keyword_display.pt')
    input_template = ViewPageTemplateFile('templates/keyword_input.pt')
    hidden_template = ViewPageTemplateFile('templates/keyword_hidden.pt')
    disabled_template = ViewPageTemplateFile('templates/disabled_hidden.pt') 

    def update(self):
       super(MyBoolWidget, self).update()

    if self.disable_widget():
        # Change widget to display mode
        self.mode = 'my_own_disabled_mode'

    def disable_widget(self):
        # Figure out if the widget should enabled or not.

   def render(self):
       if self.mode == INPUT_MODE:
            return self.input_template(self)
        elif self.mode == DISPLAY_MODE:
            return self.display_template(self)
        elif self.mode == HIDDEN_MODE:
            return self.hidden_template(self)
        elif self.mode == 'my_own_disabled_mode'
            return self.disabled_template(self)
        raise NotImplementedError(
            'Mode: "{0}" not supported'.format(self.mode))

# Following the patterns of z3c widget and create a widget factory.
# This is not necessary in this case, since there are no additional params.

@adapter(IMyBoolWidget, IFormLayer)
@implementer(IFieldWidget)
def MyBoolWidgetFactory(field, request, config=None):
    """IFieldWidget factory for..."""
    return FieldWidget(field, MyBoolWidget(request))

MyBoolFieldWidget = MyBoolWidgetFactory

使用zcml (configure.zcml)进行注册:

代码语言:javascript
复制
    <adapter factory=".widget.MyBoolWidgetFactory" />

将小部件用于布尔型字段。

代码语言:javascript
复制
from plone.autoform.interfaces import IFormFieldProvider
from plone.supermodel import model
from zope import schema
from zope.interface import provider
from plone.directives import form
from wherever.the.widget.is import widget MyBoolFieldWidget


@provider(IFormFieldProvider)
class IGoogleNews(model.Schema):
    """Behavior interface to add some Google News features."""

    form.widget('standout_journalism', MyBoolFieldWidget)
    standout_journalism = schema.Bool(
        title=_(u'Standout Journalism'),
        required=False,
    )

    news_keywords = schema.Tuple(
        title=_(u'Keywords'),
        value_type=schema.TextLine(),
        required=False,
    )

遵循这种方法,我创建了几个小部件,例如,还创建了一个KeywordWidget

好的一面是:

minimalistic

  • easy to

通常较小,但无法使用

马鲁斯:

  • 您需要手动将其应用到您需要的任何位置。

示例不包含任何模板,您可以获取from z3c.form或plone.z3cform。*

这种方法非常简单,并且没有使用小部件通常使用的所有组件。比如为每种模式注册一个小部件模板,等等。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41852551

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档