Это пример кода, полученного из виджета ftw.datepicker.
В widget.py:
# 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):
<adapter factory=".widget.MyBoolWidgetFactory" />
Используйте виджет для булева поля.
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
С положительной стороны:
- Обычно маленький и минималистичный
- проста в использовании
malus:
- Вам необходимо вручную нанести его везде, где хотите.
пример не включает в себя каких-либо шаблонов, вы можете получить их from z3c.form
или plone.z3cform. *
Этот подход довольно прост и не использует все компоненты виджета обычно. Например, зарегистрируйте шаблон виджета для каждого режима и т. Д.
Вы копаетесь в аду ;-) Возможно, проще написать собственный виджет, наследующий от исходного виджета bool. Переопределение виджета не так просто, без предоставления нового интерфейса в форме или в самом поле. Afaik Вы можете переопределить только виджет bool. – Mathias
Фактически, это была моя первоначальная идея :-) Вы знаете, как я могу это сделать? – hvelarde