2015-08-13 21 views
5

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

Antwort

4

Ich bin der Autor des Artikels, aber ich denke, dass Ihre Problem ist nicht darauf zurückzuführen.

Die in Ihrem user_name gespeicherten Daten müssen Unicode sein, aber der Aufruf api.user.get_current().id gibt (wahrscheinlich) eine 8-Bit-Zeichenfolge zurück.

So versuchen, die Linie zu ändern:

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

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. –

Verwandte Themen