Hi Tim, Tim Cook schrieb:
Thanks for all the assistance.
On Fri, 2009-01-16 at 18:05 +0100, Martijn Faassen wrote:
Yes, you do create new schema fields by subclassing from Field.
It's just that we saw you putting a field not in a schema but in what looked like a concrete object.
This has given me a BIG pause while I'm working on a simpler example. It may actually solve the problem.
Are you saying that in order to create a Field that can be used as an attribute of another class; I should define it in an interface and ONLY in an interface?
Such like pseudo:
import Field class IAbc(Interface)
myNewField = Field( ........
and then when I need to use it in a class, simply state that that class implements(IAbc)?
that's what Dan Korostelev said early in the thread: Use the Field only in a schema definition. You define your schema in an interface class. The interface class describes the interface (fields, attributes, methods) that a class implements. from zope.interface import Interface, implements from zope.schema import TextLine class IMyTitleSchema(Interface): title = TextLine(...) class MyTitleClass(object or some other baseclass): implements(IMyTitleSchema) title = u"" The interface tells other components, e.g. forms: An object instanciated from MyTitleClass has an attribute 'title', and title is a TextLine. So a form can render the correct widget. Other components do other things with this information, like validation when the title attribute is written. You never use a schema field in something other than an interface class. Don't do: class MyTitleClass(...): ... title = TextLine(...) obj = MyTitleClass() Sure you can have specialized fields that subclass from Field, TextLine, or another base class. E.g. RegistrationNumber(TextLine) that takes care to validate the input for a special format. But you use them in an interface class, not the class that implements the interface. ..Carsten