Plone-为什么我会收到WrongContainedType错误?

5

我有一个名为 IReportSettings 的接口,这个接口对应着一个注册表键,其中包含一个元组。该元组存储了使用 IUserSetting 接口的 PersistantObjects,而该接口则由一个名为 UserSetting 的对象类型实现。同时,IUserSetting 和 UserSetting 的工厂适配器已经通过 registerFactoryAdapter 方法进行了注册。

然而,当我尝试使用一组 UserSettings 设置注册表键的 IReportSettings 时,出现了错误。

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

1个回答

4

我是这篇文章的作者,但我认为你遇到的问题与它无关。

user_name 中存储的数据必须是 Unicode 格式,但调用 api.user.get_current().id 会(很可能)返回一个 8 位字符串。

因此,请尝试将该行更改为:

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

谢谢。它现在运行了。我之前因为误以为是 Unicode 字符串而困惑了。下次从 API 中获取信息时我会确保检查编码。 另外,你写的那篇文章真的很好。它帮助我更好地理解了如何使用 Plone 注册表。 - Patrick Downey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接