[Zope3-Users] clearing grouped widgets in z3c.form

John john at saponara.net
Thu Mar 6 23:01:02 EST 2008


Widgets are cleared because after zope processes the editform (with Done 
or Delete button pressed), the selectedItem in the table becomes None, 
so the addform is then displayed.  In the example, the addform and 
editform have distinct prefixes, so their fields have distinct names in 
the request object.  In particular, the editform doesnt set any of the 
addform's fields in the request object, so the addform returns with 
empty/default field values.

The problem is that widgets of grouped fields get the BaseForm's "form." 
prefix, so the group's widgets in the edit and add forms have the same 
key in the request object and thus the editform's grouped widgets are 
named the same as the addform's widgets, so those widget's editform 
values show up in the addform.  (In contrast, non-grouped widgets have 
the "add." vs "edit." prefix of their parent form.)

One way to fix this is to give groups the prefix of their parentForm.  
Groups already pass their prefix along to the widgets they create, so 
those widgets would no longer be prefixed with BaseForm's "form." 
prefix.  Alternatively, setting "ignoreRequest=True" for the addform (so 
that the addform ignores the insufficiently-distinctly-named values in 
the request object) may work sometimes (addforms can often ignore 
requests) but seems less correct.

Proposed fix: in z3c/form/group.py, class Group, method updateWidgets, 
anywhere before "self.widgets.update()" (or after self.parentForm is 
assigned in __init__), add line:
self.prefix = util.expandPrefix(self.parentForm.prefix)
(and of course "from z3c.form import util")

John


John wrote:
> In modifying the formdemo/addressbook example to use groups, I found 
> that fields in groups are not cleared to their default values when the 
> Done or Delete button is pressed in the editform, resulting in an 
> addform with values from the previous editform.  Fields that are not 
> in groups are cleared (as in the original example, which had no 
> groups); only fields in groups have this problem.  How can I fix 
> this?  And more generally, how are widgets cleared?
>
> Relevant code is attached.  The editform class is below.
>
> thanks!
>
> -------
> class CarEditForm(group.GroupForm,form.EditForm):
>  form.extends(group.GroupForm,form.EditForm)
>  noChangesMessage = None
>  fields = field.Fields(ICar).select('nPassengers')
>  groups=(carGroup1,)
>  prefix = 'car.edit.'
>  @button.buttonAndHandler(u'Delete')
>  def handleDelete(self, action):
>    # Delete the item from the address book
>    item = self.getContent()
>    addressbook = item.__parent__
>    del addressbook[item.__name__]
>    # Reset the selected item
>    ISession(self.request)[SESSION_KEY]['selectedItem'] = None
>  @button.buttonAndHandler(u'Done')
>  def handleDone(self, action):
>    # Reset the selected item
>    ISession(self.request)[SESSION_KEY]['selectedItem'] = None
> -------
>
> ------------------------------------------------------------------------
>
> _______________________________________________
> 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