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')

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java置换相关算法   在Java中读取/打开文本文件   java为什么这段代码不适用于CodeEval?   java如何将日历转换为JSON   从txt文件中读取字符串并将其存储到java中的字符数组中   字符编码Java ResourceBundles umlauts搞砸了   java为什么hashmap会根据总大小而不是填充的存储桶调整大小   java如何将Excel单元格中的数字字符串读取为字符串(而不是数字)?   java Guava的LocalCache无法使用,为什么?   java有没有办法强制JVM在单个处理器或内核上运行   java Eclipse不安装软件   将字节转换为java字符串(可能是汉字)   Java正则表达式:提取函数名   JavaTestNG:如何从多个类中指定测试方法顺序?