2015-08-13 1 views
5

У меня есть интерфейс под названием IReportSettings для раздела реестра, в котором есть кортеж, в котором хранятся PersistantObjects, которые используют интерфейс IUserSetting, который реализуется типом объекта, называемым UserSetting. Заводской адаптер для IUserSetting и UserSetting регистрируется с помощью registerFactoryAdapter. Когда я пытаюсь установить IReportSettings ключ реестра с кортежем UserSettings, я получаю сообщение об ошибке:Plone- Почему я получаю ошибку WrongContainedType?

WrongContainedType: ([WrongContainedType([WrongType('uname', <type 'unicode'>,'user_name')],'')],'value') 

Вот некоторые из моего кода:

class PersistentObject(PersistentField, schema.Object): 
    pass 

class IUserSetting(Interface): 
    user_name = schema.TextLine(title=u"User", 
           required=True, 
           default=u"", 
        ) 

    field_a= schema.List(title=u"Field A", 
         value_type=schema.Choice(vocabulary=u'my.product.vocabularies.SomeVocabulary'), 
         required=False, 
         default=None 
      ) 

    field_b = schema.TextLine(title=u"Field B", 
           required=False, 
           default = u"", 
      ) 
    . 
    . 

class UserSetting(object): 
    implements(IUserSetting) 

    def __init__(self, user_name=u'', field_a=None, field_b=u'', ..): 
     self.user_name = user_name 
     self.field_a = field_a 
     if field_a=None: 
      self.field_a = [] 
     self.field_b = field_b 
     .. 

registerFactoryAdapter(IUserSetting, UserSetting) 

class IReportSettings 
    settings = schema.Tuple(
     title=u"User settings for a Report", 
     value_type=PersistentObject(
       IUserSetting, 
       title=u"User Setting", 
       description=u"a Report Setting" 
      ), 
     required=False, 
     default=(), 
     missing_value=(), 
    ) 

В классе формы:

def saveUI(self, data): 
    user_name = api.user.get_current().id 
    field_a = data['field_a'] 
    field_b = data['field_b'] 
    . 
    . 
    registry_util = queryUtility(IRegistry) 
    user_settings = registry_util.forInterface(IReportSettings,check=False) 
    already_exists = False 
    #Iterate through user_settings.settings and check if a setting for the user already exists, update if it exists or add new if it doesn't exist 

    if already_exists == False: 
     #Add new UserSetting - Example Data 
     new_setting = UserSetting(user_name=user_name, field_a= field_a, field_b=field_b) 
     user_settings.settings += (new_setting,) 

new_setting - правильный тип, когда я его распечатал. Какие данные я могу пройти, возможно, ошибаюсь?

В моем файле registry.xml, я добавил:

<records interface="my.package.user_settings.IReportSettings" purge="False"/> 

Кроме того, Мой код основан на этой статье: http://blog.redturtle.it/plone.app.registry-how-to-use-it-and-love-it

ответ

4

Я автор статьи, но я думаю, что ваш проблема не справляется с этим.

Данные, хранящиеся внутри вашего user_name, должны быть юникодом, но вызов api.user.get_current().id будет (вероятно) возвращать 8-битную строку.

Так что попробуйте изменить строку:

user_name = api.user.get_current().id.decode('utf-8') 
+0

Спасибо. Оно работает. Я был смущен ошибкой, потому что думал, что это дает мне строку Unicode. Я обязательно буду проверять кодировку, когда вы извлекаете информацию из api. Кроме того, это была действительно хорошая статья, которую вы написали. Это помогло мне лучше понять работу с реестром plone. –

Смежные вопросы