Как отобразить словарный запас в архетипах?
Я хочу, чтобы мой пользовательский тип отображал название сохраненного словаря. Определение поля выглядит так:
atapi.LinesField(
'member_field',
searchable=1,
index='KeywordIndex',
multiValued=1,
storage=atapi.AnnotationStorage(),
vocabulary_factory='member_name',
widget=AutocompleteWidget(
label=_(u"Member Name"),
description=_(u"Multiple Lines, One Per Line."),
actb_timeout=-1,
actb_expand_onfocus=0,
actb_filter_bogus=0,
),
enforceVocabulary=0,
),
Определение словаря выглядит следующим образом:
class member_name(object):
implements(IVocabularyFactory)
def __call__(self, context=None):
items = (
SimpleTerm(value='john', title=u'John Doe'),
SimpleTerm(value='paul', title=u'Paul Smith'),
... ...
)
return SimpleVocabulary(items)
member_nameFactory = member_name()
Соответствующий шаблон страницы выглядит так:
<div tal:define="mbrs context/member_field|nothing"
tal:condition="mbrs">
Member List:
<span tal:repeat="mbr mbrs">
<span tal:replace="mbr">Member Name</span>
<span class="separator"
tal:condition="not: repeat/mbr/end" tal:replace="string:, " />
</span>
</div>
Результат примера, показывающий только значения, выглядит следующим образом: Member List: paul , john
, Как я могу отображать их названия, например: Member List: Paul Smith , John Doe
?
1 ответ
Решение
Словари (в стиле Zope3) - это просто названные утилиты, и вы можете получить их следующим образом:
from zope.component import getUtility
from zope.schema.interfaces import IVocabularyFactory
factory = getUtility(IVocabularyFactory, vocabularyname)
vocabulary = factory(self.context)
и тогда вы можете получить название термина следующим образом:
fieldvalue = self.context.getField('myfield').get(self.context)
term = vocabulary.getTerm(fieldvalue)
print "Term value is %s token is %s and title is %s" + (term.value, term.token, term.title)
Больше информации: