I use a session-based wizard with plone.z3cform that uses the concept 
from z3c.formdemo's wizard. The content is kept inside a session until 
it is written into the db in .finish().

I have problems with Lists and Choices where the vocabulary needs a 
suitable context that the content from the session doesn't provide.

By default my Vocabularyfactory fails to get it's data and returns a 
empty SimpleVocabulary. The widget is empty.
I can fill the widget with my terms like that:

     def getTerms(self, factory):
         terms = term.Terms()
         terms.terms =  factory(self.parentForm.context)
         return terms

     def updateWidgets(self):
         super(FachgebieteSchritt, self).updateWidgets()
         self.widgets['key_activities'].terms = \
                self.getTerms(cv.KeyActivitiesVocabularyFactory)
         self.widgets['key_activities'].update()


But saving the selected values fails. validator.SimpleFieldValidator 
calls the field's _validate()-Method with the wrong context (the 
content) and WrongContainedType is raised.

My actual solution is to register a NullValidator for wizard.IStep and 
zope.schema.interfaces.I[List|Choice].

Is there a more elegant way, e.g. where updateTerms and 
SimpleFieldValidator.validate() can use the right context?


A second, small problem is that I tried to use the Discriminator like 
the Doctest describes

validator.WidgetValidatorDiscriminators(NullListValidator,
                         view=interfaces.IStep,
                         field=ITCommonAddressData['key_activities'])

and thought the getSpecification-magic registers for the right 
Interface, but maybe I missunderstood the test. Registering an adapter 
by hand for zope.schema.interfaces.IList works.

..Carsten

_______________________________________________
Zope3-users mailing list
Zope3-users@zope.org
http://mail.zope.org/mailman/listinfo/zope3-users

Reply via email to