On Tue, Feb 19, 2008 at 04:46:29PM +0100, Hermann Himmelbauer wrote: > I'm over and over confronted with a simple pattern, where I need to clone > interface field. For instance, I have the content object, which has an > interface, e.g.: > > class IPerson(Interface): > name = TextLine() > address = TextLine() > > Then, I have for instance a search form, which consists of fields of other > interfaces, therefore I tried this: > > class IPersonSearch(Interface): > name = IPerson['name'] > > The above interface has the problem that the field is referenced, thus > changing attributes (e.g. name.required=False) changes also the attributes of > the original field.
Don't do that then. > Therefore I now copy the field, which seems to work (but I'm not 100% > certain): > > class IPersonSearch(Interface): > name = copy.deepcopy(IPerson['name']) I would not recommend this. > Another idea is to entirley skip the IPersonSearch interface and create the > interface "on the fly", like this: > > class SearchFrom(z3c.form.EditForm): > fields = z3c.form.field.Fields(copy.deepcopy(IPerson).select('name')) Strike out the deepcopy and you've got the correct solution: class SearchFrom(z3c.form.EditForm): fields = z3c.form.field.Fields(IPerson).select('name') > However, this does not seem to work as still some things are referenced > instead of copied, so copy.deepcopy seems to fail on interfaces. What are you trying to achieve? Zope 3 schema fields ought to be treated as immutable objects. > What's your opinion on this, how do you apply this pattern? We don't modify fields, ever. We use the power of zope.formlib (or z3c.form) to get dynamic forms. Marius Gedminas -- NT 5.0 is the last nail in the Unix coffin. Interestingly, Unix isn't in the coffin... It's wondering what the heck is sealing itself into a wooden box 6 feet underground... -- Jason McMullan
Description: Digital signature
_______________________________________________ Zope3-users mailing list Zope3email@example.com http://mail.zope.org/mailman/listinfo/zope3-users