Am 18.08.2011 um 09:59 schrieb Joshua Immanuel:
Hello all,
I use the zope.schema field's constraint parameter to check for the uniqueness of a particular field like this
class IMyObject(Interface):
def check_for_uniqueness(value): cat = getUtility(ICatalog) results = cat.searchResults(object_name=value) for rslt in results: if rslt.name.lower() == value.lower(): raise NameAlreadyExists(value) return True
name = TextLine(title=u'Name', required=True, constraint=check_for_uniqueness) ...
This goes well with the zope.formlib's AddForm.
As the value does not exist yet.
But in edit form if I modify any other field other than the 'name' field I get the 'NameAlreadyExists' error.
As you find the object which you are editing in the catalog.
Worse case scenario is where I have a cancel action button which just redirects to another page, that too screams for the NameAlreadyExists error.
Is there a way to disable the constraint check in the EditForm if the 'name' field isn't modified?
Make sure your catalog search does not return the object you are currently editing.
What is the preferred way of doing these kind of checks?
Some time a ago I wrote a blog post about objects with attributes which are unique in their container [1]. Besides it is written in German you might get the clue from the code examples. [1] http://blog.gocept.com/zope3-objekte-mit-eindeutigen-titeln-innerhalb-eines-... Mit freundlichen Grüßen -- Michael Howitz · mh@gocept.com · Softwareentwickler gocept gmbh & co. kg · Forsterstraße 29 · 06112 Halle (Saale) · Deutschland http://gocept.com · Tel +49 345 1229889 8 · Fax +49 345 1229889 1 Zope- und Plone-Beratung und -Entwicklung