вторник, 13 мая 2008 г.

Использование кириллицы в исходниках для Zope3

В то время когда я ещё только начал изучать Zope3 у меня возникла одна проблема. Здесь я привожу её решение, найти которое мне помогли в русскоязычной группе Zope3

Я написал интерфейс в котором есть следущее поле:
...
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'руб/м.кв. в мес']))
)

...

Комментариев нет:

Отправить комментарий