[Zope3-Users] Formlib and invariants
Darryl Cousins
darryl at darrylcousins.net.nz
Tue Jul 18 21:25:01 EDT 2006
Hi All,
I've had a bit of a struggle getting formlib error views to play nicely
with invariants. That is the problem I have found to trouble me is in
the zope.formlib.form.FormBase method error_views.
When I use the schema:
class IMemberRegisterForm(IMemberData, IMemberDetails):
"""Schema for a member register form."""
new_password = Password(
title=_("Choose a Password"),
required=True)
verify_password = Password(
title=_("Verify Password"),
required=True)
@invariant
def passwordsMatch(register):
if register.new_password != register.verify_password:
msg = _("Entered passwords do not match")
error = ('verify_password', _("Passwords"), msg)
raise Invalid(error)
As far as I can ascertain I must raise the Invalid exception so that it
is caught correctly in zope.interface.interface.InterfaceClass
validateInvariants method.
Now when the FormBase error_views method is called there is no
multiadapter for the Invalid exception. First option then is to create a
view for Invalid, I passed on that, and instead redefined error_views in
my view class with the following:
def error_views(self):
for error in self.errors:
if isinstance(error, basestring):
yield error
else:
if not isinstance(error, WidgetInputError):
e = list(error)[0]
error = WidgetInputError(e[0], e[1], e[2])
if isinstance(error, WidgetInputError):
view = getMultiAdapter(
(error, self.request), IWidgetInputErrorView)
title = getattr(error, 'widget_title', None)
if title:
yield '%s: %s' % (title, view.snippet())
else:
yield view.snippet()
There must be a cleaner way to do the same. That is to convert the
Invalid error to a WidgetInputError.
Has anyone done better? I am sure.
Best regards,
Darryl
More information about the Zope3-users
mailing list