Ich habe eine Schnittstelle namens IReportSettings für einen Registrierungsschlüssel mit einem Tupel, der PersistantObjects speichert, die eine Schnittstelle IUserSetting verwenden, die von einem Objekttyp namens UserSetting implementiert wird. Ein Factory-Adapter für IUserSetting und UserSetting ist mit registerFactoryAdapter registriert. Wenn ich versuche, den Registrierungsschlüssel des IReportSettings mit einem Tupel von Usersettings zu setzen, bekomme ich einen Fehler:Plone - Warum erhalte ich einen WrongContainedType-Fehler?
WrongContainedType: ([WrongContainedType([WrongType('uname', <type 'unicode'>,'user_name')],'')],'value')
Hier einige meiner Code:
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=(),
)
In einer Formularklasse:
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 ist der richtige Typ von, als ich es gedruckt habe. Welche Daten übertrage ich möglicherweise falsch?
In meiner registry.xml Datei, fügte ich hinzu:
<records interface="my.package.user_settings.IReportSettings" purge="False"/>
Auch ist mein Code zu diesem Artikel basiert: http://blog.redturtle.it/plone.app.registry-how-to-use-it-and-love-it
Danke. Es klappt. Ich war durch den Fehler verwirrt, weil ich dachte, dass es mir eine Unicode-Zeichenfolge gab. Ich werde sicher sein, für die Codierung zu überprüfen, wenn Informationen aus api so gezogen werden. Das war auch ein wirklich guter Artikel, den du geschrieben hast. Es half mir, die Arbeit mit der Plone-Registrierung besser zu verstehen. –