在我的一个Plone网站中,我有一些灵巧模型用于生成字母。模型是:“模型”(字母的基本内容),“联系人”(包含联系信息,如姓名,地址等)和“合并”(这是一个模拟对象,在其中我们替换一些模型的一部分与收件人信息)。 “Merge”对象的模式如下:
class IMergeSchema(form.Schema):
"""
"""
title = schema.TextLine(
title=_p(u"Title"),
)
form.widget(text='plone.app.z3cform.wysiwyg.WysiwygFieldWidget')
text = schema.Text(
title=_p(u"Text"),
required=False,
)
form.widget(recipients=MultiContentTreeFieldWidget)
recipients = schema.List(
title=_('label_recipients',
default='Recipients'),
value_type=schema.Choice(
title=_('label_recipients',
default='Recipients'),
# Note that when you change the source, a plone.reload is
# not enough, as the source gets initialized on startup.
source=UUIDSourceBinder(portal_type='Contact')),
)
form.widget(model=ContentTreeFieldWidget)
form.mode(model='display')
model = schema.Choice(
title=_('label_model',
default='Model'),
source=UUIDSourceBinder(portal_type='Model'),
)
创建新的“合并”对象时,我希望预设“收件人”字段,并在创建新对象的文件夹中提供所有联系人。 我按照Martin Aspelli的指南为字段添加默认值:http://plone.org/products/dexterity/documentation/manual/developer-manual/reference/default-value-validator-adaptors
它适用于文本输入字段,但我不能让它适用于“收件人”字段。生成默认值的方法如下(一些调试信息带有丑陋的打印,但稍后会删除它们);):
@form.default_value(field=IMergeSchema['recipients'])
def all_recipients(data):
contacts = [x for x in data.context.contentValues()
if IContact.providedBy(x)]
paths = [u'/'.join(c.getPhysicalPath()) for c in contacts]
uids = [IUUID(c, None) for c in contacts]
print 'Contacts: %s' % contacts
print 'Paths: %s' % paths
print 'UIDs: %s' % uids
return paths
我试图直接返回对象,它们的相对路径(在添加视图中,当访问“self.widgets ['recipients']。value”时,我得到这种类型的数据)他们的UID但没有解决方案任何影响。
我也试图返回元组而不是列表甚至生成器,但仍然没有效果。
我确实调用了该方法,因为我在实例日志中看到了跟踪。
答案 0 :(得分:3)
我认为您需要获取相关内容的“int_id”。这就是灵巧关系字段如何存储关系信息::
from zope.component import getUtility
from zope.intid.interfaces import IIntIds
@form.default_value(field=IMergeSchema['recipients'])
def all_recipients(data):
contacts = [x for x in data.context.contentValues()
if IContact.providedBy(x)]
intids = getUtility(IIntIds)
# The following gets the int_id of the object and turns it into
# RelationValue
values = [RelationValue(intids.getId(c)) for c in contacts]
print 'Contacts: %s' % contacts
print 'Values: %s' % values
return values