[Zope3-Users] Formlib and invariants?

Bernd Dorn zope-mailinglist at mopa.at
Wed May 3 23:51:52 EDT 2006


yes, this should really be fixed up in the default implementation of  
formlib

because interface.Invalid has no registered multiadapter to
  zope.app.form.browser.interfaces.IWidgetInputErrorView

you have to raise a WidgetInputError

an example for such an error:

from zope.schema import Datetime,Bool,ValidationError
from zope.app.form.interfaces import IWidgetInputError

class FromGreaterThanTo(ValidationError):
     u"""From-Date is after To-Date"""

     # this is needed to adapt to a view for formlib
     implements(IWidgetInputError)




On 03.05.2006, at 20:59, mats.nordgren wrote:

> I'm trying to do a join form with formlib and are getting errors  
> when checking
> invariants.
>
> I have my form interface IJoinForm
>
> class IJoinForm(Interface):
>     """a join form"""
>
>     username = schema.TextLine(
>         title=_('User Name'),
>         required=True)
>     password = schema.Password(
>         title=_('Password'))
>     password_check = schema.Password(
>         title=_('Enter Password Again'))
>     title = schema.TextLine(
>         title=_('Title'))
>
>     @invariant
>     def checkPasswords(obj):
>         if obj.password != obj.password_check:
>             raise Invalid("Passwords do not match")
>
> And then I have my implementation of form.Form:
>
> class JoinMetroSite(form.Form):
>     form_fields = form.Fields(IJoinForm)
>
>     @form.action('Join')
>     def handle_join_action(self, action, data):
>         principal_folder = zapi.getUtility(IAuthenticatorPlugin,  
> 'principal')
>         principal = InternalPrincipal(data['username'], data 
> ['password'],
> data['title'])
>         principal_folder[data['username']] = principal
>
> My form in registered with:
>
> <page
>         for="*"
>         class=".metrositeforms.JoinMetroSite"
>         name="join.html"
>         permission="zope.View"
>         menu="zmi_views" title="Join" />
>
> When I try the join.html form I get the following error:
>
> Traceback (innermost last):
>   Module zope.publisher.publish, line 138, in publish
>     result = publication.callObject(request, object)
>   Module zope.app.publication.zopepublication, line 161, in callObject
>     return mapply(ob, request.getPositionalArguments(), request)
>   Module zope.publisher.publish, line 113, in mapply
>     return debug_call(object, args)
>    - __traceback_info__: <security proxied
> zope.app.publisher.browser.viewmeta.JoinMetroSite instance at  
> 0x034C9B50>
>   Module zope.publisher.publish, line 119, in debug_call
>     return object(*args)
>   Module zope.formlib.form, line 739, in __call__
>     return self.render()
>   Module zope.formlib.form, line 733, in render
>     self.form_result = self.template()
>   Module zope.app.pagetemplate.viewpagetemplatefile, line 83, in  
> __call__
>     return self.im_func(im_self, *args, **kw)
>   Module zope.app.pagetemplate.viewpagetemplatefile, line 51, in  
> __call__
>     sourceAnnotations=getattr(debug_flags, 'sourceAnnotations', 0),
>   Module zope.pagetemplate.pagetemplate, line 117, in pt_render
>     strictinsert=0, sourceAnnotations=sourceAnnotations)()
>   Module zope.tal.talinterpreter, line 277, in __call__
>     self.interpret(self.program)
>   Module zope.tal.talinterpreter, line 352, in interpret
>     handlers[opcode](self, args)
>   Module zope.tal.talinterpreter, line 878, in do_defineMacro
>     self.interpret(macro)
>   Module zope.tal.talinterpreter, line 352, in interpret
>     handlers[opcode](self, args)
>   Module zope.tal.talinterpreter, line 926, in do_extendMacro
>     definingName, extending)
>   Module zope.tal.talinterpreter, line 908, in do_useMacro
>     self.interpret(macro)
>   Module zope.tal.talinterpreter, line 352, in interpret
>     handlers[opcode](self, args)
>   Module zope.tal.talinterpreter, line 538, in do_optTag_tal
>     self.do_optTag(stuff)
>   Module zope.tal.talinterpreter, line 523, in do_optTag
>     return self.no_tag(start, program)
>   Module zope.tal.talinterpreter, line 518, in no_tag
>     self.interpret(program)
>   Module zope.tal.talinterpreter, line 352, in interpret
>     handlers[opcode](self, args)
>   Module zope.tal.talinterpreter, line 878, in do_defineMacro
>     self.interpret(macro)
>   Module zope.tal.talinterpreter, line 352, in interpret
>     handlers[opcode](self, args)
>   Module zope.tal.talinterpreter, line 976, in do_defineSlot
>     self.interpret(block)
>   Module zope.tal.talinterpreter, line 352, in interpret
>     handlers[opcode](self, args)
>   Module zope.tal.talinterpreter, line 966, in do_defineSlot
>     self.interpret(slot)
>   Module zope.tal.talinterpreter, line 352, in interpret
>     handlers[opcode](self, args)
>   Module zope.tal.talinterpreter, line 878, in do_defineMacro
>     self.interpret(macro)
>   Module zope.tal.talinterpreter, line 352, in interpret
>     handlers[opcode](self, args)
>   Module zope.tal.talinterpreter, line 878, in do_defineMacro
>     self.interpret(macro)
>   Module zope.tal.talinterpreter, line 352, in interpret
>     handlers[opcode](self, args)
>   Module zope.tal.talinterpreter, line 976, in do_defineSlot
>     self.interpret(block)
>   Module zope.tal.talinterpreter, line 352, in interpret
>     handlers[opcode](self, args)
>   Module zope.tal.talinterpreter, line 878, in do_defineMacro
>     self.interpret(macro)
>   Module zope.tal.talinterpreter, line 352, in interpret
>     handlers[opcode](self, args)
>   Module zope.tal.talinterpreter, line 538, in do_optTag_tal
>     self.do_optTag(stuff)
>   Module zope.tal.talinterpreter, line 523, in do_optTag
>     return self.no_tag(start, program)
>   Module zope.tal.talinterpreter, line 518, in no_tag
>     self.interpret(program)
>   Module zope.tal.talinterpreter, line 352, in interpret
>     handlers[opcode](self, args)
>   Module zope.tal.talinterpreter, line 872, in do_condition
>     self.interpret(block)
>   Module zope.tal.talinterpreter, line 352, in interpret
>     handlers[opcode](self, args)
>   Module zope.tal.talinterpreter, line 872, in do_condition
>     self.interpret(block)
>   Module zope.tal.talinterpreter, line 352, in interpret
>     handlers[opcode](self, args)
>   Module zope.tal.talinterpreter, line 839, in do_loop_tal
>     iterator = self.engine.setRepeat(name, expr)
>   Module zope.tales.tales, line 685, in setRepeat
>     it = self._engine.iteratorFactory(name, expr, self)
>   Module zope.tales.tales, line 110, in __init__
>     self._next = i.next()
>   Module zope.formlib.form, line 748, in error_views
>     zope.app.form.browser.interfaces.IWidgetInputErrorView)
>   Module zope.component, line 154, in getMultiAdapter
>     raise ComponentLookupError(objects, interface, name)
> ComponentLookupError: ((<zope.interface.exceptions.Invalid instance at
> 0x033ED7D8>, <zope.publisher.browser.BrowserRequest instance
> URL=http://localhost/MetroSite/@@join.html>), <InterfaceClass
> zope.app.form.browser.interfaces.IWidgetInputErrorView>, u'')
>
> What am I doing wrong?
>
> Sincerely,
>
> Mats Nordgren
> _______________________________________________
> Zope3-users mailing list
> Zope3-users at zope.org
> http://mail.zope.org/mailman/listinfo/zope3-users



More information about the Zope3-users mailing list