Dolmen和Zeam窗体的窗体实用程序。
dolmen.forms.base的Python项目详细描述
从表单到字段
dolmen.forms.base 提供了一些专门用于 将dict数据应用于对象字段并触发事件以便 将更新通知处理程序
应用值
我们创建测试模型:
>>> from zope.schema import TextLine, Choice >>> from zope.interface import Interface, implements >>> class ICaveman(Interface): ... name = TextLine(title=u'a name') ... weapon = Choice(title=u'a weapon', ... values=[u'none', u'a club', u'a spear']) >>> class Neanderthal(object): ... implements(ICaveman) ... def __init__(self): ... self.name = u"no name" ... self.weapon = u"none" >>> moshe = Neanderthal() >>> moshe.name u'no name' >>> moshe.weapon u'none'
我们现在可以使用第一个函数 设置字段数据。它需要 字段列表,通过 字段 集合提取,内容 以及数据措辞。这个电话的结果是一个措辞, 使用定义字段的接口和字段 作为值的标识符:
>>> from dolmen.forms.base import Fields, set_fields_data >>> fields = Fields(ICaveman) >>> for field in fields: print field <TextLineField a name> <ChoiceField a weapon> >>> data = {u'name': u'Grok', u'weapon': u'a club'} >>> changes = set_fields_data(fields, moshe, data) >>> print changes {<InterfaceClass __builtin__.ICaveman>: [u'weapon', u'name']} >>> moshe.name u'Grok' >>> moshe.weapon u'a club'
数据dict的值可以包含标记,以警告 特殊情况:值丢失或没有更改。在这些 两种情况下,跳过值分配:
>>> from dolmen.forms.base import NO_VALUE, NO_CHANGE >>> data = {u'name': NO_VALUE, u'weapon': NO_CHANGE} >>> changes = set_fields_data(fields, moshe, data) >>> print changes {}
为事件生成更改属性
生成更改指令的一个优点是可以触发 知道某个更改格式的事件。这个 例如,iobjectmodifiedvent使用更改日志来触发 修改字段的重新索引。函数 notify_changes 是 专门用于通知应用的更改的给定事件。它需要 内容、更改指令和事件作为参数。如果事件 参数被忽略,默认情况下使用objectmodifiedvent。
我们首先生成一个更改dict:
>>> data = {u'name': u'Grok', u'weapon': u'a club'} >>> changes = set_fields_data(fields, moshe, data) >>> print changes {<InterfaceClass __builtin__.ICaveman>: [u'weapon', u'name']}
我们现在可以为iobjectmodifiedvent设置一个记录器,以便 检查是否正在广播更改:
>>> from zope.component import adapter, provideHandler >>> from zope.lifecycleevent import IObjectModifiedEvent >>> from zope.event import subscribers >>> logger = [] >>> @adapter(ICaveman, IObjectModifiedEvent) ... def changes_broadcasted(content, event): ... logger.append(event.descriptions) >>> provideHandler(changes_broadcasted)
我们现在可以将其输入函数:
>>> from dolmen.forms.base import notify_changes >>> change_log = notify_changes(moshe, changes)
记录器一定被触发了。我们可以检查它的值:
>>> logger [(<zope.lifecycleevent.Attributes object at ...>,)] >>> for attrs in logger[0]: ... print attrs.interface, attrs.attributes <InterfaceClass __builtin__.ICaveman> (u'weapon', u'name')