Я написал интерфейс в котором есть следущее поле:
...
price_unit = Choice(
title=_(u'Price unit'),
required=True,
values = (u'т.руб', u'т.руб/м.кв.', u'т.руб в мес.', u'руб/м.кв. в мес.')
)
...
Текст с исходником хранился в utf-8, и это было указанно в начале файла:
# -*- coding: utf-8 -*-
...
При запуске Zope выдавал ошибку:
...
UnicodeEncodeError: 'ascii' codec can't encode character u'\u0442' in
position 0: ordinal not in range(128)
...
Я убрал символ 'u':
...
values = ('т.руб', 'т.руб/м.кв.', 'т.руб в мес.', 'руб/м.кв. в мес.')
...
Zope запустился без ошибок, но при попытке добавить мой объект (в момент формирования формы добаления) возникает аналогичная ошибка.
Всё дело оказалось в том, что при создании виджета для поля Choice создаётся объект Vocabulary который инициализируется значениями из списка values.
Заковырка с кирилицей в Vocabulary была в том, что токены у термов должны быть строкой в ascii.
Токены для термов в данном случае генерируются вот так:
token = str(value)
где value - значение из массива values.
Тут вот как раз и возникает UnicodeDecodeError.
Я решил эту проблему самостоятельным созданием термов:
--------------------
from zope.schema.vocabulary import SimpleTerm
def getTermsFromStrings(strings):
if not isinstance(strings, type([])): strings = [strings]
return [SimpleTerm(strings[i], str(i), strings[i]) for i in xrange(len(strings))]
...
from zope.schema.vocabulary import SimpleVocabulary
...
price_unit = Choice(
title=_(u'Price unit'), required=True,
vocabulary = SimpleVocabulary(getTermsFromStrings([u'т.руб', u'т.руб/м.кв.', u'т.руб в мес', u'руб/м.кв. в мес']))
)
...
Комментариев нет:
Отправить комментарий